Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
realloc在visual studio中失败,值很大_C_Visual Studio_Realloc - Fatal编程技术网

realloc在visual studio中失败,值很大

realloc在visual studio中失败,值很大,c,visual-studio,realloc,C,Visual Studio,Realloc,当我在VS2013中运行这段代码时,它说“realloc test.exe触发了一个断点”失败。我不知道为什么,有什么想法吗?(尽管如果我尝试realloc小值,它就可以了) #包括 #包括 int main() { char*big=malloc(100); char*c; //c=malloc(INT_MAX);//这一行工作得很好,在32位构建中它将为=NULL c=(char*)realloc(big,INT_MAX);//这一个会触发断点!(或者visual studio就是这么说的)

当我在VS2013中运行这段代码时,它说“realloc test.exe触发了一个断点”失败。我不知道为什么,有什么想法吗?(尽管如果我尝试realloc小值,它就可以了)

#包括
#包括
int main()
{
char*big=malloc(100);
char*c;
//c=malloc(INT_MAX);//这一行工作得很好,在32位构建中它将为=NULL
c=(char*)realloc(big,INT_MAX);//这一个会触发断点!(或者visual studio就是这么说的)
返回0;
}
编辑:我正在为一个32位的目标构建它,根据VS的默认设置,它不允许访问超过2 Gib(几乎),所以它应该在这里失败,但只是返回一个空指针而不是触发断点


注意:我将其构建为RELEASE,如果分配失败,它将返回空指针

  • 返回值

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

  • 返回值

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


运行测试,查看您可以在计算机上分配的最大字节数(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;
}
#包括
#包括
#定义千兆字节(1024*1024*1024)
内部主(空)
{
无符号长mallocSize=0,numGigaBytes=0;
void*mallocMemory=NULL;
做
{
mallocSize+=千兆字节;
numGigaBytes=mallocSize/gigau字节;
mallocMemory=malloc(mallocSize);
if(mallocMemory)
{
printf(“动态分配的%llu GBs\n”,numGigaBytes);
空闲(mallocMemory);
}
其他的
{
printf(“未能分配%llu GBs\n”,numGigaBytes);
打破
}
}
虽然(正确);
返回0;
}
在我的机器上,我遇到以下最大值:


动态分配17 Gb
动态分配18 Gb
未能分配19 GB


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

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


我们正在研究解决这两个问题的选项,以备将来发布。同时,如果您的代码被调试断点绊倒,我建议通过定义上述环境变量来禁用Windows调试堆。

您没有足够的连续内存。即使如此,它不应该只返回NULL吗?@user730033您的代码(使用VS2010构建)对我来说确实返回NULL。这正是你失败的程序吗?@simonc是的。你的目标版本是64位吗?@herohuyongtao,是c,不能使用vector!嗯,它应该失败(内存不足),而不是用一个breakpoint@esihaj如果您正在调试中运行,如果它没有中断,我会感到震惊。如果您在发布模式下运行并使用安全CRT,请查看MS提供的文档,因为在这种情况下,它可能也会中止。无论是哪种情况,都不能在没有crtdebug的情况下发布构建/secure@WhozCraig:调用
abort
将完全中断此场景中的代码测试。无论如何,docs for只声明如果分配失败,它会将
errno
设置为
ENOMEM
。即使如此,他说释放,所以。。。VS标准库中有bug,或者他没有向我们展示他的真实代码。只有1GB(实际值略低于2GB(1.9或其他),这是visual studio限制程序可以分配的堆内存量的有趣方法,但是为什么要使用
无符号长mallocSize
而不是
大小mallocSize
大小mallocSize
malloc()
的最大整数。或者使用
void*calloc(size\t nmemb,size\t size)
因为产品可能大于
size\u t
但仍能成功分配。@在不验证某些内容的情况下快速将其组合在一起。您是对的,使用
size\u t
会更好。
#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;
}