我遇到了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)
答案 0 :(得分:1)
您的症状指向您在丢失的代码中的某处损坏了堆。您可能要么写入无效指针,要么在某处写入有效指针。退出时只会出现崩溃的原因是,只有在程序清理时才会发现堆损坏,并且不同的编译器会在此阶段执行不同的检查。
这是整个计划中唯一的malloc吗?如果是这样,那可能是你问题的一部分 - 你的'node'(又名head_node)暗示你正在用列表做某事。如果您正在访问node-&gt; next(或者您正在调用链接指针的任何内容)而没有为其执行malloc,则会出现错误。没有更多的代码,就不可能多说。
答案 1 :(得分:0)
另一个可能是问题的微妙之处,特别是因为问题随着不同的构建环境而消失,所以你不包括stdlib.h。可能是你刚刚将它从“最小”示例中删除,但没有在malloc()范围内使用原型可能会导致一些非常奇怪的问题。
答案 2 :(得分:-1)
可能是内存泄漏。你的指针可能指向一个无效的位置。它被称为悬空指针。因此,请检查您的指针是否指向有效的位置(您的指针也可能指向无效的垃圾位置)