为什么malloc有时不起作用?

时间:2012-09-15 02:04:51

标签: c windows segmentation-fault malloc porting

我正在将一个C项目从Linux移植到Windows。在Linux上它完全稳定。在Windows上,它大多数时候运行良好,但有时我遇到了分段错误。

我正在使用Microsoft Visual Studio 2010进行编译和调试,看起来有时我的malloc调用只是不分配内存,返回NULL。机器有空闲内存;它已经通过该代码一千次,但它仍然发生在不同的位置。

就像我说的那样,它并不是一直发生在同一个地方;它看起来像一个随机错误。

我在Windows上需要比在Linux上更加小心吗?我能做错什么?

3 个答案:

答案 0 :(得分:4)

malloc()在Windows上失败的另一个原因是,如果您的代码在一个DLL中分配并在另一个DLL或EXE中解除分配。

与Linux不同,在Windows中,DLL或EXE具有自己的运行时库链接。这意味着您可以使用2013 CRT链接您的程序到针对2008 CRT编译的DLL。

不同的运行时可能会以不同的方式处理堆。调试和发布CRT 肯定以不同方式处理堆。如果你在调试中malloc()和发布中的free(),那么它会破坏,这可能会导致你的问题。

答案 1 :(得分:-4)

我见过malloc失败的实例,因为指向新内存的指针本身本身没有分配:

pNewNode = malloc(sizeof(myNodeStruct) + 15000);

如果由于某种原因需要先前创建或分配pNewNode,它将无效并且malloc将失败,因为malloc分配的结果(它本身是成功的)不能存储在指针中。当这个bug出现时,我已经看到多次运行相同的程序,代码将在某些程序中运行(当指针意外出现时,但仅仅是纯粹的运气),但在许多情况下它将无处可寻它从未被分配过。

如何找到这个bug?在调试器中查看pNewNode在调用malloc之前是否实际有效。它应该指向0x000000或其他一些实际位置(在malloc分配实际分配的内存段之前实际上是垃圾)。

答案 2 :(得分:-17)

您可以根据递归函数声明自己的安全malloc:

void *malloc_safe(size_t size)
{
    void* ptr = malloc(size);
    if(ptr == NULL)
        return malloc_safe(size); 
    else
        return ptr;
}

如果malloc失败,则此函数再次调用并尝试分配内存,而ptr变为!= NULL。

使用:

int *some_ptr = (int *)malloc_safe(sizeof(int));