0

いくつかのコードをテストする際にひどいエラーに遭遇しました。free(p_current_item->s)これは、リンクリスト内のノードであるwhereを呼び出したことが原因p_current_itemであり、sはそれに含まれるchar*であることがわかりました。リストに要素を追加するだけのメソッドaddItem(node、char *)を呼び出してノードを作成しました。p_head=addItem(p_head,"this gets added"); 気になるのは、次のとおりです。

1)要素に含まれている文字列を解放する必要があるのはなぜですか。sが(私のクラスの例で行われた方法である)として宣言されるときに必要であることは知っていますchar* s = snprintf(s,(size_t),30,"this gets added");が、なぜそれが必要なのですか?構造体(この場合はlinkedListノード)に含まれる属性を解放することが可能ですか?構造体自体が解放されますか?

2)明示的に宣言されたsの値を解放しようとしたときに何が起こっていたか

3)他の方法でsの値を解放する必要がありますか?

ありがとう :-)

4

4 に答える 4

4

呼び出しのファミリーをfree使用して割り当てられたメモリのみを使用できます。malloc

二重引用符で囲まれた文字列は、コンパイル時定数です。それらは、命令テキストとともにランタイムプログラムにインポートされます。したがって、それらは動的に割り当てられていません。

またsnprintf、生成された文字列へのポインタではなく、生成された文字列の長さを返します。正しい使用法は次のとおりです。

size_t length = snprintf(s,(size_t)30,"this gets added");

1) 、またはその家族からの別の呼び出しsを使用して割り当てられた場合にのみ、解放する必要があります。例えばmalloccallocchar* s = malloc(1024);

2)呼び出しのファミリーfree("constant string");によって割り当てられていないメモリの割り当てを解除しようとしているため、せいぜいセグメンテーション違反が発生します。malloc通常、これは未定義の動作です。

3)定数文字列を解放する必要はありません。それらはテキストの一部であり、解放したい場合でも解放することはできません。

于 2012-10-11T14:41:12.927 に答える
0

sコードで行ったように宣言すると、ヒープに割り当てられません。そして、またはfree()を使用してヒープに動的に割り当てたメモリを解放する必要がある場合にのみ呼び出されます。これは、コードには当てはまりません。malloccalloc

于 2012-10-11T14:40:30.530 に答える
0

のようなリテラル文字列に"this gets added"は、グローバル変数や変数と同様に、実行可能ファイルに固定メモリアドレスが割り当てられstaticます。それらの割り当てを解除する必要はなく、割り当てを解除することもできません。

クリーンアップ関数が呼び出す必要があるかどうかがわからない状況があり、場合によっては呼び出すfree()必要がある場合、最善の解決策は、すべてのヒープベースのコピーを作成し、常にを呼び出すことfree()です。便利なことに、:を使用して文字列に対してこれを行うことができますstrdup()

p_head=addItem(p_head, strdup("this gets added"));
于 2012-10-11T14:40:39.307 に答える
0

1)要素に含まれている文字列を解放する必要があるのはなぜですか。sがchar*として宣言されている場合に必要であることを私は知っています。s=snprintf(s、(size_t)、30、 "これは追加されます"); (これは私のクラスの例で行われた方法です)しかし、なぜそれが必要なのですか?構造体自体が解放されたときに、構造体(この場合はlinkedListノード)に含まれる属性を解放することは可能ですか?

割り当てたメモリを解放する必要があります。

char *s = snprintf(s, ...)

それを間違っています。必要がある:

char *s = NULL;   // Declare memory -- and initialize it to NULL just to be safe.
                  // This way, using unallocated memory will be easily spotted.

s = malloc(30);   // Allocate the memory
if (NULL == s)    // Check that it has been allocated.
{
    abort();
}
// Use the memory: sprintf into s
snprintf(s, "My name is %s", 30, "John");

// Use the result
printf("%s\n", s);

free(s);    // Free the memory
s = NULL;   // If you're really paranoid, NULL out its pointer.
            // This way, also using no-longer-allocated memory will be spotted.

また、 valgrindに会い、彼が柔軟性がないが貴重な友人であることに気付くかもしれません。

2)明示的に宣言されたsの値を解放しようとしたときに何が起こっていたか

何も良いことがない :-) 。メモリアロケータがエラーを検出し、事態が悪化するのを防ぐためにプログラムをすぐにクラッシュさせました。

3)他の方法でsの値を解放する必要がありますか?

あなたがそれを割り当てたなら、はい。上記を参照。

于 2012-10-11T14:44:46.767 に答える