簡體   English   中英

在c ++中刪除&new

[英]delete & new in c++

這可能是一個非常簡單的問題,但請幫助我。

我想知道當我調用new和delete時會發生什么,例如在下面的代碼中

char * ptr=new char [10];

delete [] ptr;

調用new返回我的內存地址。 它是否在堆上分配了精確的10個字節,其中存儲了有關大小的信息。當我在同一個指針上調用delete時,我在調試器中看到在10個字節之前和之后有很多字節被更改。

是否有每個新的標頭包含有關new分配的字節數的信息。

非常感謝

它分配精確的10個字節

這是依賴於實現的。 保證是“ 至少 10個字符”。

哪里有關於大小的信息存儲?

這是依賴於實現的。

是否有每個新的標頭包含有關新分配的字節數的信息?

這是依賴於實現的。

“這依賴於實現”我的意思是它沒有在標准中定義。

這完全取決於編譯器和運行時庫。 它只是精確定義了newdelete對你的程序有什么影響,但是沒有指定這些是如何被接受的。

在你的情況下,似乎分配了比請求更多的內存,它可能存儲管理信息,如當前內存塊的大小,有關可用空間的相鄰區域的信息或信息,以幫助調試器嘗試檢測緩沖區溢出和類似的問題。

它完全依賴於實現。 一般情況下,您必須在其他地方存儲元素的數量。 實現必須為至少指定的元素數分配足夠的空間,但它可以分配更多。

是否有每個新的標頭包含有關new分配的字節數的信息。

這是平台依賴但是,在許多平台上都有。

確切地說,根據標准, new char[10]將在堆中分配至少 10個字節。

newdelete的內部是依賴於實現的。 所以它會因編譯器和平台而異。 此外,您還可以找到各種分配器算法(例如: TCMalloc )。

我給你的是如何在內部工作的概述,但不要把它當作絕對真理。 它僅出於解釋的目的而編寫。

簡而言之, new運算符在內部調用malloc malloc使用一個非常長的可用內存塊鏈表,即free chain 當調用malloc ,它會查找此列表以查找足以容納請求大小的第一個塊。 之后,它將塊分成兩部分,一部分是您請求的大小,另一部分是其余部分,然后將其添加回自由鏈。 最后,它返回具有請求大小的塊。

反向發生在free調用中,由delete / delete []調用。 簡而言之,它將提供的塊放回到free chain

在我上面描述的過程中可能有花哨的技巧,比如對free chain排序,將請求的大小四舍五入到下一個2的冪,以減少內存碎片,等等。

char * ptr=new char [10];

您正在堆中創建一個包含10個字符的數組,並將第0個元素的地址存儲在指針中。這類似於在C中執行malloc

delete [] ptr;

您正在刪除(釋放內存)由早期語句分配的堆內存。這類似於在c中執行free。

它取決於實現,但大多數內存塊的元數據通常存儲在返回內存地址之前的區域中。 您在10個字節之前觀察到的更改可能是為此塊更新了元數據(可能是正在寫入元數據的塊的大小),並且在10個字節之后是為下一個塊更新的元數據(仍然未分配,可能指向空閑列表中下一個塊的指針)。

由於它不可移植,所以不要把堆搞得一團糟。 但是,如果你想做這樣的堆魔術,我建議你實現自己的內存池(只需從堆中獲取大量內存並自行管理)。 一個可能的起點是看libmm

雖然細節是依賴於實現的,但實現需要存儲的一條信息是數組中的元素數量。 或者,如果它不直接存儲它,則需要從分配的塊大小中准確地導出它。

原因是因為如果使用new []分配了一個對象數組,當使用delete []刪除它們時,需要調用數組中每個對象的析構函數。 delete []需要知道要銷毀多少個對象。 這就是為什么有必要將new與delete和new []與delete []匹配。

暫無
暫無

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

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