realloc在视觉工作室失败,价值很高

时间:2014-01-19 00:52:44

标签: c visual-studio realloc

当我在VS2013中运行此代码时,它无法说“realloc test.exe已触发断点”。我不知道为什么,任何想法?(虽然如果我尝试重新分配小值,那就没问题了)

#include<stdlib.h>
#include <limits.h>
int main()
{
    char *big = malloc(100);
    char *c;
    //c = malloc(INT_MAX);// this line works perfectly, on a 32bit build it will be = NULL
    c = (char *)realloc(big, INT_MAX);//this one triggers a breakpoint!(or that's what visual studio says)
    return 0;
}
编辑:我正在为32位目标构建它,根据VS的默认设置不允许访问超过2个Gib(差不多),所以它应该在这里失败,但只是返回一个NULL指针而不是触发断点! / p>

注意:我正在将其构建为RELEASE

3 个答案:

答案 0 :(得分:1)

调试断点由调试Windows堆管理器触发。即使您使用发行版CRT,如果在调试器下启动该进程,Windows堆也将启用调试检查。在开始调试过程之前(或在项目的调试设置中),可以通过将环境变量_NO_DEBUG_HEAP定义为1来禁用这些调试检查。

CRT调试堆也有一个类似的检查(默认情况下)在非常大的分配上断言,但是这个检查仅出现在调试CRT中(发布CRT在其堆实现中实际上没有逻辑 - 它只是调用到操作系统堆函数)。

我们正在研究为将来的版本解决这两个问题的方案。与此同时,如果您的代码在调试断点上跳闸,我建议您通过定义上述环境变量来禁用Windows调试堆。

答案 1 :(得分:0)

如果分配失败,它将返回空指针。

    来自http://en.cppreference.com/w/cpp/memory/c/malloc

  •   

    返回值

         

    指向新分配的内存开头的指针,如果发生错误则指向空指针。必须使用std :: free()。​​

    取消分配指针
  • 来自http://www.cplusplus.com/reference/cstdlib/malloc/

  •   

    返回值

         

    成功时,指向由函数分配的内存块的指针。   此指针的类型始终为void *,可以将其强制转换为所需类型的数据指针,以便可以取消引用。   如果函数未能分配所请求的内存块,则返回空指针。

答案 2 :(得分:0)

运行测试以查看您可以在计算机上分配的最大字节数(GB):

#include <stdio.h>
#include <stdlib.h>

#define GIGA_BYTE (1024 * 1024 * 1024)

int main(void)
{
    unsigned long long mallocSize = 0, numGigaBytes = 0;
    void *mallocMemory = NULL;

    do
    {
        mallocSize += GIGA_BYTE;
        numGigaBytes = mallocSize / GIGA_BYTE;
        mallocMemory = malloc(mallocSize);
        if(mallocMemory)
        {
            printf("Dynamically allocated %llu GBs\n", numGigaBytes);
            free(mallocMemory);
        }
        else
        {
            printf("Failed to allocate %llu GBs\n", numGigaBytes);
            break;
        }
    }
    while(true);

    return 0;
}

在我的机器上,我遇到了以下最大值:

  

...
  动态分配17 GB   动态分配18 GB   无法分配19 GB