c-malloc问题和内存堆



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

#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: %pn", 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: %pn", ptr);
free(ptr);
printf("done");
}

其中节点在其他地方声明。

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

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

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

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

这是显示的异常消息:

File: f:ddvctoolscrt_bldself_x86crtsrcdbgheap.c
Line: 1322
Expression: _CrtIsValidHeapPointer(pUserData)

您的症状表明您损坏了丢失代码中的某个地方的堆。您可能正在向无效指针写入内容,或者在某个地方向有效指针写入过多内容。只有在退出时才会出现崩溃,原因是只有在程序清理时才会注意到堆损坏,并且不同的编译器在这个阶段会进行不同数量的检查。

这是你整个程序中唯一的malloc吗?如果是这样的话,这很可能是你问题的一部分——你的"节点"(又名head_node)意味着你正在用列表做一些事情。如果您正在访问node->next(或者您正在调用链接指针的任何东西),而没有为此执行malloc,则存在错误。如果没有更多的代码,就不可能说得更多。

另一个可能是问题的微妙之处,尤其是因为问题随着不同的构建环境而消失,那就是你没有包括stdlib.h。这可能是因为你只是把它排除在了"最小"示例之外,但没有malloc()的原型可能会导致一些非常奇怪的问题。

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

相关内容

  • 没有找到相关文章

最新更新