天天看點

c++動态數組(二)之allocator類allocator類

new在靈活性上面一些局限性,以友善它将記憶體配置設定和對象構造組合在了一起,delete将記憶體釋放和對象析構組合在一起。

當配置設定一大塊記憶體時,我們通常計劃在這塊記憶體上面按需構造對象。在這種情況下,我們希望記憶體配置設定和對象構造分離。這意味着我們可以配置設定大塊記憶體,但隻有在真正需要時才真正執行對象建立操作。

new表達式配置設定并初始化n個對象,但是我們可能不需要n個對象,這樣我們就可能建立了一些永遠也用不到的對象。而且,對于那些确實要使用的對象,我們也在初始化之後立即賦予了它們新值。每個使用到的元素都被指派了兩次:第一次是預設初始化時,第二次是指派時。

更重要的是,那些沒有預設構造函數的類就不能動态分數組了。

allocator類

它幫助我們将記憶體配置設定和對象構造分離開來。

為了定義一個allocator對象,我們必須知名這個allocator可以配置設定的對象類型。

allocator<string> alloc;
    auto const p = alloc.allocate();//配置設定10個未初始化的string
           

allocator配置設定未構造的記憶體

allocator<string> alloc;
auto const p = alloc.allocate();//配置設定10個未初始化的string
auto q = p;//q指向最後構造的元素之後的位置

alloc.construct(q);
cout << *q << endl;//*q是空字元串
q++;
alloc.construct(q,,'c');//*q是cccccccccc
cout << *q << endl;
q++;
alloc.construct(q, "hi");//*q是hi
cout << *q << endl;
           

當我們用完對象時,必須對每個構造的元素調用destroy來銷毀他們。destroy接收一個指針

while(q!=p){
    alloc.destroy(--q);//釋放我們真正構造的string
}
           

q指向最後構造的元素之後的位置。

一旦元素被銷毀之後,我們就可以重新使用這部分記憶體來儲存其他string。釋放記憶體通過調用deallocate來完成。

繼續閱讀