簡體   English   中英

內存分配和0大小:我可以獲得內存泄漏嗎?

[英]memory allocation and 0 size: can I get the memory leaks?

我的問題位於我的代碼評論中:

int* a = new int[0];// I've expected the nullptr according to my logic...
bool is_nullptr = !a; // I got 'false'
delete[] a; // Will I get the memory leaks, if I comment this row?

謝謝。

對於C ++ 11,並給出了您的代碼:

int* a = new int[0];

根據5.3.4 / 7,零是合法的大小:

當noptr-new-declarator中的表達式的值為零時,將調用分配函數以分配不帶元素的數組。

調用的運算符符合18.6.1.2(強調我的):

void * operator new [](std :: size_t size);

...

3必需行為:與operator new(std :: size_t)相同 此要求綁定在此函數的替換版本上。

4默認行為:返回operator new(size)。

......參考18.6.1.1 ......

void* operator new(std::size_t size);

3必需的行為:將非空指針返回到適當對齊的存儲(3.7.4),否則拋出bad_- alloc異常。 此要求綁定在此函數的替換版本上。

因此,返回的指針必須為非null。

你需要事后delete[]

在C ++ 03中, new int[0]導致未定義的行為,因為[]之間的值必須是嚴格正值 - 零是不好的(5.3.4 / 6“New”)。 因此,詢問之后是否存在內存泄漏在某種意義上是毫無意義的。

在C ++ 11中, new int[0]導致調用分配器以分配零長度數組(5.3.4 / 7“New”)。 如果分配請求成功,則返回一個指針 - 標准中沒有任何內容表明該指針所指向的塊所包含的內存量,除了它必須至少是所請求的大小。 但是,它至少具有分配至少一個字符的效果,因為分配器在釋放之前不能再次返回該地址。 在實踐中,簿記開銷將不止一個字符。

是的,存在泄漏,並且它不依賴於實現。

這個新表達式不能產生空指針。 它通過調用operator new[]分配內存,這需要“將非空指針返回到適當對齊的存儲,否則拋出bad_alloc異常”(參見C ++11§18.6.1.1/ 3和§18.6.1.2) / 3)。

此外,分配函數要求(第3.7.4.1節)要求對分配函數的每次調用都返回一個指針,該指針與已分配但尚未解除分配的所有其他指針不同。 因此,實現不能簡單地具有它總是返回的單個“空分配”指針。

這樣,每個數組形式的新表達式都會分配一些東西 ,即使范圍是零。 如果您沒有通過delete[]解除分配該對象,則表明您已將其泄露。

是的,沒有delete會有內存泄漏。

每個new都必須與delete配對。 即使程序員分配的大小為0.由於對齊要求,管理開銷或其他任何原因,分配器可能會分配比請求更多的內存。

在這種情況下,它是 實現定義是否將返回 nullptr但是 你應該小心不要取消引用這個指針也不要調用delete會導致內存泄漏。

Wrt調用delete規則很簡單:
“如果你打電話給new你必須打電話給delete 。”

更正:
由於其他答案中的引用已經明確,它無法返回nullptr

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM