malloc问题和内存堆

时间:2012-12-15 01:12:23

标签: c windows malloc free corruption

我遇到了mallocing /释放内存的奇怪问题。我无法显示整个代码本身,所以请使用非常简单的部分:

#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");
}

其中node在其他地方声明。

在我释放ptr并且它的初始值在释放它之前是相同的并且它不是NULL时,我得到了Windows中的错误对话框。

现在这里是奇怪的部分。当我在MinGW下编译它并在MSYS(MinGW控制台shell)或其外部运行它时,它不会遇到任何错误。当我在MS Visual Express 2012下构建它并在其下调试它时,它不会遇到任何错误。但是当我在MS Visual之外运行由MS Visual Express构建的相同程序时,我总是会收到错误。

甚至更奇怪的是它首先打印出“完成”,这是在错误弹出之前程序的最后一点。跟踪错误来源时没有多大帮助...

如果在正常的Windows环境中发现了任何错误,那么为什么不在MS Visual ??

这是显示的异常消息:

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

3 个答案:

答案 0 :(得分:1)

您的症状指向您在丢失的代码中的某处损坏了堆。您可能要么写入无效指针,要么在某处写入有效指针。退出时只会出现崩溃的原因是,只有在程序清理时才会发现堆损坏,并且不同的编译器会在此阶段执行不同的检查。

这是整个计划中唯一的malloc吗?如果是这样,那可能是你问题的一部分 - 你的'node'(又名head_node)暗示你正在用列表做某事。如果您正在访问node-&gt; next(或者您正在调用链接指针的任何内容)而没有为其执行malloc,则会出现错误。没有更多的代码,就不可能多说。

答案 1 :(得分:0)

另一个可能是问题的微妙之处,特别是因为问题随着不同的构建环境而消失,所以你不包括stdlib.h。可能是你刚刚将它从“最小”示例中删除,但没有在malloc()范围内使用原型可能会导致一些非常奇怪的问题。

答案 2 :(得分:-1)

可能是内存泄漏。你的指针可能指向一个无效的位置。它被称为悬空指针。因此,请检查您的指针是否指向有效的位置(您的指针也可能指向无效的垃圾位置)