当我在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
答案 0 :(得分:1)
调试断点由调试Windows堆管理器触发。即使您使用发行版CRT,如果在调试器下启动该进程,Windows堆也将启用调试检查。在开始调试过程之前(或在项目的调试设置中),可以通过将环境变量_NO_DEBUG_HEAP
定义为1
来禁用这些调试检查。
CRT调试堆也有一个类似的检查(默认情况下)在非常大的分配上断言,但是这个检查仅出现在调试CRT中(发布CRT在其堆实现中实际上没有逻辑 - 它只是调用到操作系统堆函数)。
我们正在研究为将来的版本解决这两个问题的方案。与此同时,如果您的代码在调试断点上跳闸,我建议您通过定义上述环境变量来禁用Windows调试堆。
答案 1 :(得分:0)
如果分配失败,它将返回空指针。
返回值
指向新分配的内存开头的指针,如果发生错误则指向空指针。必须使用std :: free()。
取消分配指针
返回值
成功时,指向由函数分配的内存块的指针。 此指针的类型始终为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