2012-12-10 243 views

回答

56

第一行分配單個int並將其初始化爲100int(100)視爲構造函數調用。

由於這是標量分配,試圖訪問arr[1]或使用delete[]釋放內存將導致未定義的行爲。

+5

@RedX:如果你想放置'new'的,這是不是它(語法是不同的)。 – NPE

+14

@RedX:不,它會指向一個包含int值100的動態分配地址。你正在考慮int * arr =(int *)100;' –

+4

@SteveJessop或者,正如NPE建議的那樣, 'new(100)int'。 –

8

它分配一個int類型的對象並將其初始化爲值100

很多人不知道,你可以傳遞一個初始化到new,有應更廣爲人知,從而避免使用memset做出了具體的成語:

new int[100](); 

這將分配一個數組int並對其元素進行零初始化。

另外,您不應該使用new的陣列版本。永遠。爲此目的有std::vector

+1

「一個特定的習慣應該被廣爲人知......你不應該使用新的陣列版本」 - 那麼爲什麼這個習語應該更廣爲人知呢? ;-) –

+1

@SteveJessop,好點:)雖然在修復舊的代碼庫時,刪除memset和添加括號比用'vector'替換new更容易。 – avakar

+0

@avakar,我仍然沒有得到什麼是... new int [100](); 有人可能用一個例子詳細闡述 – eRaisedToX

0

第一個創建一個新的整數,將其初始化爲值100並返回一個指向它的指針。

在C/C++中,指向數組的指針和指向單個值的指針(指向數組的指針實際上只是指向其第一個元素的指針)之間沒有區別。所以這是用一個元素創建數組的有效方法。

+4

指向數組的指針看起來像'int(* arr)[100]',C++可以區分。只是'new'不會返回一個指向數組的指針,即使你分配了一個數組 - 而是它返回一個指向數組的第一個元素的指針。原因是大小是指向數組的指針類型的一部分,當然'new'不能返回一個不同的類型,這取決於在運行時傳遞它的大小。 –

+2

應該是「C++無法區分指向數組元素的指針和指向單個值的指針。」 –

21

Wikipedia new(C++)報價:

int *p_scalar = new int(5); //allocates an integer, set to 5. (same syntax as constructors) 
int *p_array = new int[5]; //allocates an array of 5 adjacent integers. (undefined values) 
+1

+1表示引用。 – Richard

+2

@Richard,但我被教導說維基百科不是一個可靠的來源! –

+4

@AlvinWong這不是,幾乎是根據定義。 (對於這個問題)唯一的「可靠」源代碼就是C++標準(如果你引用了任何東西,這就是你應該引用的內容)。 –

相關問題