0

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

#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 控制台外壳)或外部运行它时,它不会遇到任何错误。当我在 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)
4

3 回答 3

1

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

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

于 2012-12-15T02:50:15.607 回答
0

可能是一个问题的另一件微妙的事情,特别是因为随着不同的构建环境问题消失了,你没有包括 stdlib.h。可能是您只是将其排除在“最小”示例之外,但在 malloc() 范围内没有原型可能会导致一些非常奇怪的问题。

于 2013-03-12T09:58:28.653 回答
-1

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

于 2012-12-15T04:30:03.687 回答