memory-management new用法 - C++new int [0]-它會分配內存嗎?





array delete (5)


是的,分配一個0大小的塊與new是完全合法的。 你根本無法做任何有用的事情,因為沒有有效的數據供你訪問。 int[0] = 5; 是非法的。

不過,我相信這個標准允許像malloc(0)這樣的東西返回NULL

你仍然需要delete []你從分配中獲得的任何指針。

簡單的測試應用程序:

cout << new int[0] << endl;

輸出:

0x876c0b8

所以它看起來像是有效的。 標準對此有何評論? “分配”空的內存塊是否合法?




奇怪的是,C ++要求operator new返回一個合法的指針,即使在請求零字節時也是如此。 (要求這種奇怪的聲音行為可以簡化語言中的其他地方。)

我發現有效的C ++第三版在“項目51:寫入新的和刪除時遵守約定”中就是這樣說的。




是的,像這樣分配一個零大小的數組是合法的。 但是你也必須刪除它。




從5.3.4 / 7開始

當直接新聲明符中表達式的值為零時,將調用分配函數來分配一個沒有元素的數組。

從3.7.3.1/2開始

取消引用作為零大小請求返回的指針的效果未定義。

即使[新]請求的空間大小為零,請求也可能失敗。

這意味著你可以做到這一點,但你不能合法地(在所有平台上以明確的方式)解引用你得到的內存 - 你只能將它傳遞給數組刪除 - 並且你應該刪除它。

這裡有一個有趣的腳註(即不是標準的規範部分,但包含在說明中)附於3.7.3.1/2

[32。 目的是讓operator new()通過調用malloc()或calloc()來實現,所以規則基本相同。 C ++與C不同之處在於要求零請求返回一個非空指針。]




那麼,我發現在你的第二個解決方案中,你從cin切換到scanf ,這是我準備給你的第一個建議(cin is sloooooooooooow)。 現在,如果你從scanf切換到fgets ,你會看到性能的另一個提升: fgets是字符串輸入最快的C ++函數。

順便說一句,不知道那個同步的事情,很好。 但你仍然應該嘗試fgets







c++ memory-management new-operator standards-compliance