1

クラス用に C でプログラムを作成しており、ペア プログラミングを行っています。どうすればプログラムがクラッシュしないのか不思議です。私のパートナーはこのコード ブロックを以下に追加しました。私は valgrind を実行してテストし、メモリ リークがあるかどうかを確認しました。とにかく、このコードがどのように機能するのか疑問に思っていました。なぜなら、私が curr を解放すると、次に実行されるのは curr = curr->link だからです。では、メモリから取り出された場合、どのようにして curr がリンクを持つことができるのでしょうか? このようなものはうまくいかないと思いました。

これが私のパートナーが書いたものです:

for(node curr = list->head; curr != NULL; curr = curr->link ){
   if (!dflag) printf("%s\n",curr->words);
   else printf("[%p]\n",curr);
   free(curr->words);
   free(curr);
}

^ this ^ がクラッシュした場合に備えて、私が考えていたことは次のとおりです。

for (node curr = list->head; curr != NULL; ) {
   if (!dflag) printf("%s\n",curr->words);
   else printf("[%p]\n",curr);
   node prev = curr;
   curr = curr->link;
   free(prev);
}

また、ノードの作成方法は次のとおりです。

typedef struct node *node;

struct node {
   cstring words;
   node link;
};
4

2 に答える 2

2

メモリを解放したからといって、その内容が失われたわけではありません。メモリがの別の呼び出し元に返され、呼び出し元がそれに書き込むまで、コンテンツはしばらくそこにとどまる可能性がありますmalloc()

明らかに、これに依存することはできず、依存すべきではありません。valgrind解放されたメモリへのアクセスに関連するエラーが出力されているはずです。

これは、私たちの旧友である「未定義動作」のインスタンスです。なぜそれが特定の方法で動作するのかを説明することはできますが、これが発生するという保証はなく、それに依存することは定義上エラーです。このため、そのようなものがクラッシュした場合、実際にはもっと幸運です。そのようなものが見過ごされ、予期しないときにあらゆる種類の奇妙な問題を引き起こす可能性が非常に高いからです。

于 2013-02-20T06:29:41.593 に答える
0

-g有用な valgrind 出力を取得するには、フラグを付けてコンパイルする必要があります。最初のコードは間違っています。なぜなら、解放されたデータを仮定することができないからです。自己ポインタを定義する通常の方法は次のようになります。

struct node {
   cstring words;
   struct node *link;
};
于 2013-02-20T06:31:47.053 に答える