2012-12-15 136 views
0

我一直在运行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) 
+2

这似乎是一个可编译的最小代码。 *此*代码是否显示问题行为?如果它确实表明你的环境存在问题,如果不是,那么你可以开始在“很多事情”的一小部分中重新加入以学习更多东西。这就是说,我怀疑你是双免费的。请注意'free'不会改变它的参数值。 – dmckee

+0

不幸的是,这个最小的代码不会重现错误。实际的主代码很长很复杂。它不得不包括其他文件,我不愿意这样做。当你说我可能会双倍释放某些东西时,你可能会做些什么。我会检查它。 –

回答

1

你的症状指向你在缺少代码某处损坏堆。你可能要么写一个无效的指针,要么写太多的地方到一个有效的指针。只有在程序清理完成时才会发现堆损坏,并且在此阶段不同的编译器会执行不同的检查次数。

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

+0

我认为这不太可能是节点的“下一个”成员有问题,或者没有malloc-ed它是下一个节点。我有打印功能打印每个节点的内容。他们都打印得很好而且有序。 –

+0

写得太多似乎更合理,我只是修正了昨天的情况。 –

+0

就像我说的,没有看到更多的代码,一切都只是在黑暗中拍摄。 – iagreen

-1

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

0

另一个微妙的事情可能是一个问题,特别是因为问题在不同的构建环境中消失,你是不包括stdlib.h。这可能是因为你只是把它放在你的“最小”的例子中,但是没有malloc()的作用域的原型会导致一些非常奇怪的问题。