2016-11-02 41 views
4

在C++中,當我們分配一個數組時,在初始化數組後,無法找到數組的大小。那麼當我試圖在程序結束時釋放內存時,刪除操作符如何知道要刪除的內存量?在C++中刪除數組時釋放內存

int main() 
{ 
    int* p = new int[10]; 
    int* q = new int[30]; 
    //... bunch of code 
    //... 
    // ... bunch of code 
    delete[] p; 
    delete[] q; 
    return 0; 
} 
+0

這一切都由您的編譯器和/或C++庫處理。足以說正確的事情會發生。 –

+2

簡短的回答是「然而它想要」。 –

+0

https://isocpp.org/wiki/faq/freestore-mgmt#num-elems-in-new-array – melpomene

回答

12

new運營商最終建立在堆上的條目,並且堆分配器知道如何去分配它以前分配的事情。這些信息通常不可用於您的代碼,因爲它是您不應該混淆的所有C++內部信息。

所以基本上堆的元數據描述了這種分配。

請記住,在C++中,您可以write your own allocator,因此如果您願意,newdelete[]可能最終與該接口連接。如果你看看std::allocator是如何定義的,請注意,你沒有義務告訴任何人已經做了什麼分配,也沒有必要告訴任何特定分配有多大。分配器在這裏擁有巨大的自由度,並且規範不允許大量的詢問。

+0

分配器感知的容器調用的分配器特性的釋放函數實際上會帶有一個大小以及一個指針,它是應該代表先前分配的大小。因此,要一般使用分配器,您有義務以某種方式跟蹤您自己的堆請求大小並將其傳回。所以它與新的和刪除的情況完全不同。 –