2011-11-26 90 views
0

我知道Windows 32位允許任何大約2 GB的內存地址空間的進程作爲最大值。 2千兆字節= 2147483648字節。我試圖分配堆內存遠遠超過2147483648個字節更多,我看不出有什麼錯誤或異常,此代碼:進程的內存地址空間

# include<iostream> 

int main(){ 

    void *x=malloc(2147489999); 
    free(x); 
    system("pause"); 
    return 0; 
} 

的原因是什麼?

+0

你是怎麼想的錯誤或警告應該用信號? – pezcode

+0

異常或任何其他通知? – Aan

+2

C沒有例外,'malloc'是C,而不是C++。 'malloc'通過返回NULL來表示失敗。你沒有觀察到返回值。 – asveikau

回答

5

你不檢查返回值:)

#include <windows.h> 
#include <malloc.h> 
#include <stdio.h> 
#include<iostream> 

#define PAUSE getchar 

int 
main(int argc, char *argv[]) 
{ 
    void *x=malloc(2147489999); 
    if (x) 
    { 
     printf ("malloc succeeded: 0x%x...\n", x); 
     free(x); 
    } 
    else 
    { 
     perror ("malloc failed"); 
    } 
    PAUSE(); 
    return 0; 
} 

C:\ TEMP> \ BIN \ vcvars32爲使用Microsoft Visual C++工具設置環境。 C:\ temp> notepad tmp.cpp

C:\ temp> cl tmp.cpp Microsoft(R)32位C/C++優化編譯器 版本12.00.8168用於80x86版權所有(C)Microsoft Corp 1984-1998 。 保留所有權利。

tmp.cpp ... /out:tmp.exe tmp.obj

C:\ TEMP> TMP的malloc失敗:沒有錯誤

+0

哦!感謝paulsm4,但我仍然不能malloc 2 GB!嘗試'malloc(2147483648)'? – Aan

+3

@Adban:您的*總數*進程地址空間限制爲2 GB。不只是你的數據。操作系統必須將代碼放在某處,並使用所有DLL,以及操作系統保留的任何開銷......如果要分配恰好2 GB,則必須使用64位操作系統。 –

+0

@GregHewgill:我明白了這一點,謝謝。 – Aan

相關問題