[英]Memory leak or not?
我在一個更大的代碼中間有一小段代碼:
int *p = new int[100];
p += 50;
delete []p;
編譯器將只刪除從第51 位的位置記憶? 我認為確實如此。 但是,在數組指針的情況下,編譯器會保存一個附加項,該項指示已分配的對象數。 那么,在這種情況下,是否應該繼續刪除超出分配大小的內存? 或不會刪除第51 個 -100 th元素,並保持第1 -50 個在存儲器中,在這種情況下內存泄漏可能發生。
它實際上是未定義的行為。 你只能delete
/ delete[]
你從new
/ new[]
得到的東西。
這是未定義的行為。 C ++標准說 :
3.7.4.2釋放功能
3 ...否則,如果標准庫中提供給
operator delete(void*)
的值不是先前調用operator new(std::size_t)
或operator new(std::size_t, const std::nothrow_t&)
返回的值之一,則行為未定義operator new(std::size_t, const std::nothrow_t&)
標准庫中的operator new(std::size_t, const std::nothrow_t&)
,如果標准庫中提供給operator delete[](void*)
的值不是前一次調用返回的值之一,則行為operator new(std::size_t, const std::nothrow_t&)
標准庫中的operator new[](std::size_t)
或operator new[](std::size_t, const std::nothrow_t&)
。4 ...使用無效指針值(包括將其傳遞給釋放函數)的效果未定義。 (在某些實現中,它會導致系統生成的運行時故障。)
編譯器不分配或刪除內存,它依賴於操作系統,如果你在一個你沒有從new獲得的指針值上調用free會發生什么。 唯一能保證的是它是錯誤的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.