我錯誤地使用類似:
int *arr = new int(100);
,並將其傳遞編譯,但我知道這是不對的。它應該是
int *arr = new int[100];
編譯器認爲這是什麼時,我寫錯了嗎?
我錯誤地使用類似:
int *arr = new int(100);
,並將其傳遞編譯,但我知道這是不對的。它應該是
int *arr = new int[100];
編譯器認爲這是什麼時,我寫錯了嗎?
第一行分配單個int
並將其初始化爲100
。將int(100)
視爲構造函數調用。
由於這是標量分配,試圖訪問arr[1]
或使用delete[]
釋放內存將導致未定義的行爲。
它分配一個int
類型的對象並將其初始化爲值100
。
很多人不知道,你可以傳遞一個初始化到new
,有應更廣爲人知,從而避免使用memset
做出了具體的成語:
new int[100]();
這將分配一個數組int
並對其元素進行零初始化。
另外,您不應該使用new
的陣列版本。永遠。爲此目的有std::vector
。
「一個特定的習慣應該被廣爲人知......你不應該使用新的陣列版本」 - 那麼爲什麼這個習語應該更廣爲人知呢? ;-) –
@SteveJessop,好點:)雖然在修復舊的代碼庫時,刪除memset和添加括號比用'vector'替換new更容易。 – avakar
@avakar,我仍然沒有得到什麼是... new int [100](); 有人可能用一個例子詳細闡述 – eRaisedToX
第一個創建一個新的整數,將其初始化爲值100並返回一個指向它的指針。
在C/C++中,指向數組的指針和指向單個值的指針(指向數組的指針實際上只是指向其第一個元素的指針)之間沒有區別。所以這是用一個元素創建數組的有效方法。
指向數組的指針看起來像'int(* arr)[100]',C++可以區分。只是'new'不會返回一個指向數組的指針,即使你分配了一個數組 - 而是它返回一個指向數組的第一個元素的指針。原因是大小是指向數組的指針類型的一部分,當然'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表示引用。 – Richard
@Richard,但我被教導說維基百科不是一個可靠的來源! –
@AlvinWong這不是,幾乎是根據定義。 (對於這個問題)唯一的「可靠」源代碼就是C++標準(如果你引用了任何東西,這就是你應該引用的內容)。 –
@RedX:如果你想放置'new'的,這是不是它(語法是不同的)。 – NPE
@RedX:不,它會指向一個包含int值100的動態分配地址。你正在考慮int * arr =(int *)100;' –
@SteveJessop或者,正如NPE建議的那樣, 'new(100)int'。 –