2014-01-19 57 views
3

當我在VS2013中運行此代碼時,它失敗說「realloc test.exe已觸發了一個斷點。」我不知道爲什麼,任何想法(不過,如果我嘗試realloc的小值這將是確定)realloc在值大的visual studio中失敗

#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指針不觸發斷點!

注:我建立它作爲RELEASE

+1

您沒有足夠的_contiguous_內存。 – SLaks

+2

即使如此,不應該只是返回NULL? – esihaj

+1

@ user730033您的代碼(使用VS2010構建)確實爲我返回NULL。這是確切的程序,你失敗了嗎? – simonc

回答

0

如果未能分配它會返回一個空指針。

+2

好吧,它應該失敗(沒有足夠的內存),不要停止帶有斷點的程序 – esihaj

+0

@esihaj如果你正在運行調試,如果它沒有中斷,我會感到震驚。如果您使用安全CRT以發佈模式*和*運行,請檢查MS的文檔,因爲它可能會在該情況下中止。 – WhozCraig

+0

沒有一個,發佈版本沒有crtdebug/secure – esihaj

0

運行一個測試,看看哪些字節(GBS)的最大數量,你可以在你的機器上分配:

#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

+0

只有1 GB(真實值僅略低於2 GB(1.9或某物),這是視覺工作室限制程序可以分配的堆內存量 – esihaj

+0

我正在使用NetBeans。 –

+0

有趣的方法,但爲什麼使用'unsigned或者使用'void * calloc(size_t nmemb,size_t size);'因爲產品可能大於'size_t'',因此產品可能會比'size_t'大。並且仍然可以成功分配 – chux

1

調試斷點由調試Windows堆管理器觸發。即使使用釋放CRT,如果您在調試器下啓動進程,Windows堆將啓用調試檢查。在開始調試過程(或在項目的調試設置中)之前,可以通過定義環境變量_NO_DEBUG_HEAP1來禁用這些調試檢查。

CRT調試堆也有類似的檢查(默認情況下)在非常大的分配上斷言,但是此檢查僅存在於調試CRT中(發佈CRT在其堆實現中實際上沒有邏輯 - 它只是調用操作系統堆函數)。

我們正在研究解決這兩個問題以便將來發布的選項。與此同時,如果你的代碼跳過了調試斷點,我建議通過定義上述環境變量來禁用Windows調試堆。