簡體   English   中英

我可以刪除指向已分配數組但不指向數組開頭的指針嗎?

[英]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&)

不,不合法。 您只能deletenew返回的內容,並且完全相同的內容適用於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進行專門驗證。

在此處輸入圖片說明

如果您沒有通過它的開始,則delete將不會獲得額外的信息。

不合法它不會崩潰的事實並不意味着在其他情況下也不會崩潰。 如果啟用驗證程序,它肯定會崩潰。 而且無論如何它都不會釋放您的數組。 這只是CRT / Windows,可讓您的程序在應有的狀態下不崩潰

暫無
暫無

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

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