[英]Can I delete a memory previously allocated dynamically, but with a different pointer?
[英]Can I delete[] a pointer that points into an allocated array, but not to the start of it?
我特別想知道以下情況(我在一些必須使用的代碼中發現了這種情況):
SomeClass *ar = new SomeClass[2];
ar++;
delete[] ar;
這段代碼似乎運行良好-即不會崩潰(win32,使用VS2005構建)。
這是“合法的”嗎? 當然感覺不對。
不,這是不明確傳遞任何地址, delete
它完全不會受到返回new
。
這是標准的報價。
第3.7.4.2-3節
如果釋放函數因引發異常而終止,則該行為未定義。 提供給解除分配函數的第一個參數的值可以是空指針值。 如果是這樣,並且如果釋放函數是標准庫中提供的函數,則該調用無效。 否則,提供給標准庫中的運算符delete(void*)
的值應為先前調用運算符new(std::size_t)
或operator new(std::size_t, const std::nothrow_-t&)
返回的值之一。標准庫中的operator new(std::size_t, const std::nothrow_-t&)
,並且標准庫中提供給運算符delete[](void*)
的值應為先前調用operator new[](std::size_t)
或標准庫中的operator new[](std::size_t, const std::nothrow_t&)
。
不,不合法。 您只能delete
從new
返回的內容,並且完全相同的內容適用於new[]
和delete[]
不它不是。 您必須在從new []收到的同一地址(或指針)上調用delete []。 您可能會很幸運,它沒有崩潰,但是絕對不能正確清除內存。
參考文獻:
從http://www.cplusplus.com/doc/tutorial/dynamic/
The value passed as argument to delete must be either a pointer to a memory block
previously allocated with new, or a null pointer (in the case of a null pointer,
delete produces no effect).
從http://msdn.microsoft.com/en-us/library/h6227113.aspx
Using delete on a pointer to an object not allocated with new gives
unpredictable results. You can, however, use delete on a pointer with the
value 0. This provision means that, when new returns 0 on failure, deleting
the result of a failed new operation is harmless.
從標准文檔開始。 5.3.5.2 Delete
,
...在第二個替代方案(刪除數組)中,刪除操作數的值應為由先前數組new-expression產生的指針值。72)如果不是,則行為未定義。 ....
子注釋72)也指出,
72)對於非零長度數組,這與指向由該new表達式創建的數組的第一個元素的指針相同。 零長度數組沒有第一個元素。
是的,它是未定義的。
該標准指出,您只能刪除使用new分配的內容,但這並不能解釋為什么它崩潰,或者在這種情況下不會崩潰。
刪除指針時,會將其放回堆中以在以后的分配中再次使用。 典型的實現為您提供了一個指針,該指針在指針跟蹤塊中的內存之前為int(這是典型的malloc實現)。 這樣,對於典型的32位系統。
p-4 size here
p--> +--------+
| your |
| block |
因此,如果您指向該塊的中間,它將把它之前的字節解釋為一個大小,從而可能導致災難性的后果。 您的微小代碼示例使您免於看到崩潰的危險。 在那之后,您可能再也沒有嘗試過分配。 如果在此之后嘗試分配某些內容,它可能會崩潰,因為它將嘗試回收您剛交還的某些內存。
確切原因顯然取決於實現方式。 這只是為了解釋不正確刪除操作失敗的一種常見方式,而未針對Visual Studio 2005進行專門驗證。
不合法它不會崩潰的事實並不意味着在其他情況下也不會崩潰。 如果啟用驗證程序,它肯定會崩潰。 而且無論如何它都不會釋放您的數組。 這只是CRT / Windows,可讓您的程序在應有的狀態下不崩潰
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.