0

私はメモリのマロッキング/解放に関して奇妙な問題に遭遇しています。コード全体を表示することはできないので、ごくわずかな部分で済ませてください。

#include <stdio.h>

int main(void)
{
     void *ptr;

     ptr = malloc(sizeof(node));

     /* making sure what the value is when it was initialized */
     printf("head_node: %p\n", ptr);


     /* i do a lot of things here, such as appending the node, sometimes truncating them */


     /* --------------------------------------------------------------------------------*/

     /* making sure what the value is still the same: */
     printf("head_node: %p\n", ptr);
     free(ptr);

     printf("done");
}

ここで、ノードは別の場所で宣言されます。

ptrを解放し、解放する直前の初期値が同じで、NULLでない時点で、ウィンドウにエラーダイアログボックスが表示されます。

今ここに奇妙な部分があります。MinGWでコンパイルし、MSYS(MinGWコンソールシェル)内または外部で実行しても、エラーは発生しません。MS Visual Express 2012でビルドしてデバッグしても、エラーは発生しません。しかし、MSVisualの外部でMSVisual Expressによって構築された同じプログラムを実行すると、常にエラーが発生します。

さらに奇妙なのは、エラーがポップアップする前のプログラムの最後のポイントである「完了」を最初に出力することです。エラーの原因を追跡する場合はあまり役に立ちません...

通常のWindows環境でキャッチされているエラーがあった場合は、MSVisualではどうでしょうか。

表示されている例外メッセージは次のとおりです。

File: f:\dd\vctools\crt_bld\self_x86\crt\src\dbgheap.c
Line: 1322
Expression: _CrtIsValidHeapPointer(pUserData)
4

3 に答える 3

1

あなたの症状は、不足しているコードのどこかでヒープが破損していることを示しています。おそらく、無効なポインターに書き込みを行っているか、どこかの有効なポインターに書き込みすぎている可能性があります。終了時にのみクラッシュが発生する理由は、プログラムがクリーンアップしているときにのみヒープの破損が認識され、このフェーズでさまざまなコンパイラがさまざまな量のチェックを行うためです。

これは、プログラム全体で唯一の malloc ですか? もしそうなら、それはおそらくあなたの問題の一部です - あなたの「ノード」(別名head_node)は、リストで何かをしていることを意味します。そのためのmallocを実行せずにnode-> next(またはリンクポインターを呼び出しているもの)にアクセスしている場合、エラーがあります。あなたのコードがなければ、それ以上のことは言えません。

于 2012-12-15T02:50:15.607 に答える
0

特に別のビルド環境で問題がなくなるため、問題になる可能性のあるもう1つの微妙なことは、stdlib.hを含めていないことです。「最小限の」例から除外しただけかもしれませんが、malloc() のスコープにプロトタイプがないと、非常に奇妙な問題が発生する可能性があります。

于 2013-03-12T09:58:28.653 に答える
-1

メモリリークの可能性があります。ポインタが無効な場所を指している可能性があります。これはダングリングポインタと呼ばれます。したがって、ポインタが有効な場所を指しているかどうかを確認してください(ポインタが無効なジャンクの場所を指している可能性もあります)

于 2012-12-15T04:30:03.687 に答える