[英]delete & new in c++
這可能是一個非常簡單的問題,但請幫助我。
我想知道當我調用new和delete時會發生什么,例如在下面的代碼中
char * ptr=new char [10];
delete [] ptr;
調用new返回我的內存地址。 它是否在堆上分配了精確的10個字節,其中存儲了有關大小的信息。當我在同一個指針上調用delete時,我在調試器中看到在10個字節之前和之后有很多字節被更改。
是否有每個新的標頭包含有關new分配的字節數的信息。
非常感謝
它分配精確的10個字節
這是依賴於實現的。 保證是“ 至少 10個字符”。
哪里有關於大小的信息存儲?
這是依賴於實現的。
是否有每個新的標頭包含有關新分配的字節數的信息?
這是依賴於實現的。
“這依賴於實現”我的意思是它沒有在標准中定義。
這完全取決於編譯器和運行時庫。 它只是精確定義了new
和delete
對你的程序有什么影響,但是沒有指定這些是如何被接受的。
在你的情況下,似乎分配了比請求更多的內存,它可能存儲管理信息,如當前內存塊的大小,有關可用空間的相鄰區域的信息或信息,以幫助調試器嘗試檢測緩沖區溢出和類似的問題。
它完全依賴於實現。 一般情況下,您必須在其他地方存儲元素的數量。 實現必須為至少指定的元素數分配足夠的空間,但它可以分配更多。
是否有每個新的標頭包含有關new分配的字節數的信息。
這是平台依賴但是,在許多平台上都有。
確切地說,根據標准, new char[10]
將在堆中分配至少 10個字節。
new
和delete
的內部是依賴於實現的。 所以它會因編譯器和平台而異。 此外,您還可以找到各種分配器算法(例如: 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.