我知道,你必須做這樣的:動態分配的數組如何在C++中被釋放?
int * p;
p = new int[10];
//use array
delete [] p;
現在我的問題是:因爲它沒有明確說明,它怎麼可能是正確的內存量被釋放?操作系統是否跟蹤分配的內存和它的起始地址?
我知道,你必須做這樣的:動態分配的數組如何在C++中被釋放?
int * p;
p = new int[10];
//use array
delete [] p;
現在我的問題是:因爲它沒有明確說明,它怎麼可能是正確的內存量被釋放?操作系統是否跟蹤分配的內存和它的起始地址?
運行時庫將跟蹤分配的內存塊。在給定初始指針new
的情況下,保證正確釋放塊。
雖然這可以在操作系統本身(理論上)實現,它通常不是。操作系統跟蹤的是分配給整個流程的頁面,而不是在這個抽象層次上分配的單個塊。
是的,操作系統(或更可能是圖書館)保持跟蹤。
當您分配內存時,操作系統會爲您的內存創建一個小標題,這通常在分配的內存之前 - 也就是稍微低一點的地址。
當釋放內存時,它將指針釋放,返回幾個字節,然後檢查描述實際分配的結構,包括分配的大小。
這是一種方法來做到這一點。 – 2009-10-08 21:54:18
它完全取決於實施。就像普通的malloc()/ free()一樣,系統必須保存一些額外的信息,正如你所提到的。一般來說,對malloc()或new運算符的調用會在它返回給你的指針之前在內存中設置一個頭結構,以便稍後當free()或delete運算符被調用時,它可以計算出怎麼了與你交給你的記憶塊。
它取決於實現,但我認爲運行時庫使用某種內存分配表來跟蹤分配的塊。
重複:http://stackoverflow.com/questions/197675/how-does-delete-know-the-size-of-the-operand-array – 2009-10-08 21:47:05