第十二章動態記憶體 allocator類

2021-09-13 00:15:37 字數 2503 閱讀 2562

new和delete的兩部分操作:記憶體分配(釋放)物件構造(析構)

當分配一大塊記憶體時,我們計畫在這塊記憶體上按需構造物件,在此情況下希望記憶體分配和物件構造分離。這表示:我們可以分配大塊記憶體,但是只有真正需要時才執行物件建立操作(同時付出一定開銷)

將記憶體分配和物件構造組合在一起可能會導致不必要的浪費:

string *const p = new string[n]; 

string s = "aaa";

*p =s;

更重要的是,沒有預設建構函式的類就不能動態分配陣列(???不太理解)

標頭檔案:memory

作用:幫助我們將記憶體分配和物件構造分離開。提供一種型別感知的記憶體分配方法,分配的記憶體是原始的、未構造的。

類似於vector,allocator是乙個模板。必須指明allocator可以分配的物件型別。

allocate()

分配一段記憶體,儲存n個型別

allocatoralloc; //可以分配string的allocator物件

auto const p = alloc.allocate(n);//分配n個未初始化的string

這個allocator呼叫為n個string分配了記憶體

allocator分配未構造的記憶體

allocator分配未構造的記憶體(unconstructed),需要按需構造物件。

construct()

乙個指標,表示在指定位置開始構造

零個(多個)額外引數,用來初始化構造的物件

auto q = p; //q指向最後構造的元素之後的位置

alloc.construct(q++);//*q為空字串

alloc.construct(q++,10,'c');//*q為cccccccccc

alloc.construct(q++,"hi");

還未構造物件的情況下就使用原始記憶體是錯誤的!

cout對於每個構造的元素必須使用destroy來銷毀它們。

destroy()

接受乙個指標,對指向物件執行析構函式

while(q!=p)

alloc.destroy(--q);//釋放我們真正構造的string

warning:我們只能對真正構造了的元素進行destroy操作。一旦元素被銷毀後,就可以重新使用這部分記憶體來儲存其他string,也可以歸還給系統,釋放記憶體通過deallocate來完成:

alloca.deallocate(p,n);
deallocate()第乙個引數指標:指向allocate分配的記憶體;

第二個引數大小引數,必須與呼叫allocatee分配的大小一致。

拷貝和填充未初始化記憶體的演算法

allocator類定義了兩個伴隨演算法,在未初始化記憶體中建立物件。

note:假設b,e是兩個指標,並且p是一塊記憶體,uninttialized_copy()表示在p這塊記憶體,建立b到e區間的所有元素。

//分配比vi中元素所占用空間大一倍的動態記憶體

auto p = alloc.allocate(vi.size() * 2);

//通過拷貝vi的元素來構造從p開始的元素

auto q = uninttialized_copy(vi.begin(),vi.end(),p);

//將剩餘的元素初始化為42

uninitialized_fill_n(q,vi.size(),42);

傳遞給uninitialized_cpy的目的位址迭代器必須指向未構造的記憶體,與copy不同,uninitialized_copy在給定目的位置構造元素。

類似copy,uninitialized_copy返回(遞增後的)目的位置迭代器,uninitialized_copy呼叫會返回乙個指標,指向最後乙個構造的元素之後的位置。

第十二章 動態記憶體

程式除靜態記憶體和棧記憶體,還有自由空間 free store or 堆 heap 使用動態記憶體容易造成記憶體洩漏 忘記delete new分配的空間。share ptr類 模板。最好用make shared函式來分配記憶體。shared ptr p1 make shared shared ptr...

c primer第十二章動態記憶體小結 12

第十二章 動態記憶體 1.動態記憶體 c 中,動態記憶體管理是通過一對運算子完成的 new和delete。c語言中通過malloc與free函式來實現先動態記憶體的分配與釋放,c 中new與delete的實現其實會呼叫malloc與free。由於 c 語言沒有自動記憶體 機制,每次 new 出來的記...

第十二章 動態規劃 2019 04 01

1 最優化原理,也就是最優子結構性質。這指的是乙個最優化策略具有這樣的性質,不論過去狀態和決策如何,對前面的決策所形成的狀態而言,餘下的諸決策必須構成最優策略。簡單來說就是乙個最優化策略的子策略總是最優的,如果乙個問題滿足最優化原理,就稱其具有最優子結構性質。2 無後效性。指的是某狀態下決策的收益,...