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