[英]Why can't I delete other-than-first element from array by pointer
考慮以下代碼:
int main()
{
int *intArPtr = new int[100];
int *intArPtr1 = intArPtr + 1;
delete [] intArPtr; //ok
//delete intArPtr; //valgrind warning, but no leaks!
//delete intArPtr1; //invalid pointer error
return 0;
}
我知道delete [] intArPtr
是刪除這個數組的唯一有效方法,但我只是對以下內容感到好奇:
delete intArPtr
不會產生任何內存泄漏? 是不確定的行為,我很幸運沒有任何? delete intArPtr1
會在運行時出錯? 為什么不首先從數組中刪除所有元素?
- 為什么
delete intArPtr
不會產生任何內存泄漏? 是不確定的行為,我很幸運沒有任何?
正確,在使用new[]
分配的內存上調用delete
是未定義的行為。 首先,它不會調用數組成員上的析構函數。
對於兩個,即使您只是詢問內存釋放而不是關於對象破壞, delete
和delete[]
也可以相同地實現,或者它們可以不同。 他們讀起來就像他們是一樣的但他們不是: delete
和delete[]
是兩個不同的運算符,可能有不同的實現。 他們可以使用不同的分配策略(參見下面問題#3的答案)。
- 為什么
delete intArPtr1
會在運行時出錯? 為什么不首先從數組中刪除所有元素?
你必須傳遞delete
一個用new
分配的指針。 確切的指針。 不是new
分配的內存區域中的指針,不起作用。 它必須是指向該區域起點的相同指針。
- C ++的運行時如何知道已分配數組的大小(對於delete [])? 它存放在某個地方嗎?
公共分配器策略是存儲在分配區域之前分配的字節數。 然后delete
將獲取您傳遞它的指針,向左看4或8個字節,並將該整數解釋為該區域的大小。 如果您將指針傳遞給其他地方,則其回溯策略將失敗。
C ++語言沒有指定如何跟蹤內存分配,因此這是一個實現細節。 不同的標准庫,編譯器和操作系統將以不同方式執行此操作。 我所描述的只是一種可能的機制。
進一步閱讀:
是的,不是在同一時間。 使用delete
而不是delete[]
並不干凈,但通常有效。 基本上,指針和偏移量都在分配時存儲。 這允許在使用delete
時進行適當的釋放,即使是偶然的。
intArPtr1
與分配區域的指針不對應。 嘗試delete
,運行時無法在分配表中找到此地址。
它存儲在分配表中,指針指向已分配的區域。
回答:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.