11

free特定のポインターを ing した後、セグメンテーション違反が発生します。

free(studentDB->name);

エラーや警告なしで値を取得できます。

printf("[DBG] studentDB->name: %s\n", studentDB->name);

しかし、私が言ったように、プログラムを解放しようとするとプログラムがクラッシュします。freeコマンドがセグメンテーション違反を引き起こす最も一般的な原因は何ですか?

4

7 に答える 7

16

あなたがそれをしなかったならmalloc()、あなたはそれをすることはできませんfree()。どこstudentDB->nameから来たの?

于 2010-02-21T21:38:11.203 に答える
3

おそらく、すでに free() を実行しているか、ブロックの前の malloc 情報をバッファ オーバーランで上書きしています。

于 2010-02-21T21:38:35.573 に答える
2

通常、プログラム内の別の場所でヒープが破損しています。通常、ヒープは連続しており、ヒープ マネージャーはヒープ ブロックをヘッダーで囲み、ブロックを追跡します。ブロックのヘッダーを上書きしても、アクセスは問題ありfreeませんが、失敗する可能性が最も高くなります。

于 2010-02-21T21:40:04.197 に答える
0

studentDB->name以前に割り当てられましたか? そのフィールドにメモリを割り当てなかった場合、 を呼び出したときにfreeセグ フォールトが発生する可能性があります。mallocそのフィールドをチェックして、 d またはdであることを確認してくださいstrdup

または、ヒープの他の場所に破損があること、それはあなたが正しく指摘したようにこれと一致しましたname...の値を見ることができます

これがお役に立てば幸いです。よろしくお願いします、トム。

于 2010-02-21T21:41:50.300 に答える
0

マンページから:

free( ptr ) は、ptr が指すメモリ空間を解放します。これは、malloc()、calloc()、または realloc() への以前の呼び出しによって返されたものでなければなりません。それ以外の場合、または free(ptr) が以前に呼び出された場合、未定義の動作が発生します。ptr が NULL の場合、何も実行されません。

次のことも確認できます。

  1. studentDB は、メンバ「名前」を含むクラス/構造体への非 NULL ポインタですか?
  2. studentDB->name が指すスペースは、malloc/calloc/realloc によって返されましたか?
于 2010-02-21T23:47:18.853 に答える
0

からのセグメンテーション違反は、 で割り当てられていないか、既に 'd'freeされたポインターでそれを呼び出すことによって発生する可能性があります。mallocfree

studentDB->name割り当てられたコードを投稿すると役立ちます。

于 2010-02-21T21:38:57.693 に答える
0

また、studentDB が NULL の場合、studentDB ポインターの name メンバーにアクセスするとセグメンテーション違反になる可能性があります。

于 2010-02-21T21:49:53.197 に答える