2011-01-10 47 views
0
int a = 10; 
int *p = new int[0]; 

p = &a; 
cout << *p << endl; 

在C++中,如果通過零分配內存大小會發生什麼?在C++中按大小零分配內存?

分配後我得到有效的內存指針,並打印有效的數字。

但我認爲新的運營商應該返回類似FAILD或NULL。

任何人都可以解釋細節嗎?

+4

您示例的後半部分與分配無關。你只是「忘記」了分配,泄漏了內存,並使用了分配的內存。 – SilverbackNet 2011-01-10 03:24:38

+2

重複:http://stackoverflow.com/questions/1087042/c-new-int0-will-it-allocate-memory – Anthony 2011-01-10 03:30:40

回答

1

在C++中,如果零分配內存的大小會發生什麼?

零大小的數組是有效的。
你可以去參考任何成員。

這就是爲什麼希臘人花了這麼長時間辯論它作爲一個數字爲零的想法。但是,我們可以感謝印度的偉大頭腦,因爲它最終將零數字作爲0.它永遠消耗了它們,我們不是很高興它們做到了,如果沒有這種獨特的價值,許多現代數學將不可能實現。

分配後,我得到有效的內存指針,

這是正確的。
如果失敗,則會拋出異常。

並打印有效數字。

您的任務:p = &a;可能不是你想要的。因爲這只是泄漏內存並將p指向變量a。你可能試圖做的是:

(*p) = a; 
// or 
p[0] = a; 

這是未定義的行爲。
正如您在數組結尾後賦值。

但我認爲new運算符應該返回類似FAILD或NULL的東西。

大家能否詳細解釋一下?

是的。

3

分配後,我得到有效的內存指針,並打印有效數字。

您提供的代碼實際上並沒有進行測試。

當你做p = &a,你重新分配p指向的地方完全不同。無論它以前持有什麼都與繼續執行該計劃無關。

1

您在「a」的塊上分配指針「p」,以便在打印時p不再指向零大小的塊。

1

從ISO/IEC 14882:2003(E)5.3.4.6

在直接新的說明符的每個常數表達式應該是一個整型常量表達式(5.19)和評價一個嚴格爲正值。新直接聲明者中的表達應具有整數或者非零的值(3.9.1)。 [例如:如果n是一個int類型的變量,那麼新的float [n] [5]是格式良好的(因爲n是直接新聲明符的表達式),但是新的float [5] [n]是形成不良(因爲n不是一個常量表達式)。如果n爲負數,則新float [n] [5]的效果未定義。]

它們是智能的。零可以被認爲是non-negative value?可能是肯定的,因爲它編譯沒有問題,我想。

1

從ISO/IEC 14882:2003(E),5.3.4.7

當表達在 直新聲明符是零值,則分配 函數被調用,以分配 沒有元素的數組。

所以你得到一個有效的指針,但是你不能解引用它,並且仍然必須刪除[]它。