我一直在运行mallocing /释放内存一个奇怪的问题。我不能显示整个代码本身,所以请做一个非常裸露的部分: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: %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,我得到在Windows中的错误对话框。
现在这里是奇怪的部分。当我在MinGW下编译它并在MSYS(MinGW控制台shell)或其外部运行它时,它不会遇到任何错误。当我在MS Visual Express 2012下构建它并在它下面进行调试时,它不会遇到任何错误。但是当我运行由MS Visual Visual Studio构建的同一个程序时,我总是得到一个错误。
什么是更奇怪的是,它首先打印出“完成”,这是在错误弹出之前程序的最后点。当跟踪错误的来源时不是很有用...
如果在正常的Windows环境中有任何错误被捕获,那为什么不在MS Visual?中?
这里所显示的异常消息:
File: f:\dd\vctools\crt_bld\self_x86\crt\src\dbgheap.c
Line: 1322
Expression: _CrtIsValidHeapPointer(pUserData)
这似乎是一个可编译的最小代码。 *此*代码是否显示问题行为?如果它确实表明你的环境存在问题,如果不是,那么你可以开始在“很多事情”的一小部分中重新加入以学习更多东西。这就是说,我怀疑你是双免费的。请注意'free'不会改变它的参数值。 – dmckee
不幸的是,这个最小的代码不会重现错误。实际的主代码很长很复杂。它不得不包括其他文件,我不愿意这样做。当你说我可能会双倍释放某些东西时,你可能会做些什么。我会检查它。 –