2012-07-24 75 views
2

我正在爲STL編寫基於堆棧的分配器。這個想法是一次分配一大塊內存,讓它在構建對象時建立起來,然後在需要時將其重置爲零。例如,這可用於存儲遊戲級別信息或用於爲遊戲循環的單次迭代創建的對象。當你加載一個級別時,你建立了堆棧,當你需要加載一個新的級別時,你只需將頂部指針重置到開始位置,不需要OS調用。刪除分配給自定義新運算符的對象

現在我的問題是標準分配器的做法,即deallocate()函數。在this文章中,我可以讀取

在缺省分配,存儲塊被釋放使用 ::運算符刪除。

這意味着通過使用deallocate()函數,內存被釋放並且析構函數被調用。現在對於我的分配器的purpouse,我可以使deallocate()函數爲空,因爲我不會爲單個對象釋放內存。

所以,問題是,STL容器如何使用分配器類來創建新對象?由於默認分配器使用newdelete,容器有沒有呼叫construct()destroy()我應該讓我的deallocate()函數也調用descrutor?

我想同樣的問題是allocate()construct()方法。

回答

6

這意味着通過解除分配()函數兩存儲 被釋放,調用析構函數

不,它不需要。 ::operator delete是全局刪除功能,它只是釋放內存。 delete運算符是一個不同的東西,儘管名稱相似 - 它會破壞並調用刪除函數(全局刪除函數或超載)。

析構函數由分配器的destroy函數調用。

標準容器使用allocate得到一些記憶,然後construct如果當他們需要的內存包含的元素,destroy當且僅當他們construct ED和deallocate釋放內存。例如:

{ 
    std::vector<int> v; // may or may not call anything on the allocator 
    v.reserve(10000); // calls 'allocate' 
    v.resize(100); // calls 'construct' 100 times 
    v.resize(50); // calls 'destroy' 50 times 
} // destructor calls 'destroy' 50 times and then 'deallocate'