allocator類
. 為了讓new分配乙個物件陣列,需要在型別名後跟方括號,括號中是分配物件的數目,該數目必須是整型,但不必是常量;
new t 分配的記憶體並不是得到乙個陣列,而是得到乙個陣列元素型別的指標,因此不能對動態陣列呼叫begin和end;
與普通陣列不同的是,普通陣列不能定義長度為0的陣列,但是使用new時卻能在後面的中括號中使用0:int* p = new int[0],這裡返回乙個合法的非空指標,
該指標可以作比較操作,但是不能解引用,因為它不指向任何元素。
預設情況下,new分配的物件是預設初始化的;
可以對陣列中的元素進行值初始化,方法是在大小之後加乙個空括號:**int p = new int10***;
在新標準中,可以通過花括號進行列表初始化:**int p = new int[5]***,如果列表中的數目小於分配數目,剩餘部分進行值初始化,如果列表中的數目大於分配數目,語句執行失敗。
. 為了釋放動態樹組,使用一種特殊形式的delete,在delete和指標中間加上乙個中括號:delete p,該語句首先銷毀p所指向的陣列中的最後乙個元素,然後逆序進行銷毀;
當我們釋放乙個指向陣列的指標時,空方括號是必需的:它指示編譯器此指標指向乙個物件陣列的第乙個元素,當我們delete乙個物件陣列時忽略了方括號,
或者在delete乙個單一物件的時候使用了方括號,編譯器或許不會給出警告,但是其行為都是未定義的。
標準庫提供了乙個可以管理new分配的陣列的unique_ptr版本。使用方式如下:
//p指向乙個包含10個未初始化int的陣列
unique_ptrp(new int[10]);
up.release(); //自動用delete銷毀指標
上面的**中p所指向的型別是乙個int陣列,因此不能使用點運算子和箭頭運算子,與此同時可以使用下標運算子來訪問陣列中的元素。
new有一些靈活性上的侷限,其中一方面表現在它將物件的記憶體分配和物件構造組合在一起,類似的delete將物件的記憶體釋放和物件的析構函式組合在一起,比如:
string const p = new string[100],但我們可能永遠用不到第100個string*,當分配一大塊記憶體時,通常計畫在這塊記憶體上按需構造物件,在這種情況下,則希望能將記憶體分配和物件構造分離開來,這意味著可以分配大塊記憶體,但是只在真正需要的時候執行物件建立操作。
. 標準庫allocator類定義在標頭檔案memory中,類似vector,它是乙個模板。當乙個allocator物件分配記憶體時,它會根據給定的物件型別來確定恰當的記憶體大小和對齊位置,其分配的記憶體是原始的、未被構造的記憶體:
allocatorallc; //可以分配string的allocator物件
auto const p = allc.allocate(n); //分配n個未初始化的string
其演算法如下:
. 可以按需要在allocator分配的原始記憶體中構造物件,這樣才能正常使用,使用未被構造的記憶體,行為將是未定義的。
使用construct成員函式來初始化構造物件:
auto q = p;
allc.construct(q++); //*q為空字串
allc.construct(q++,10,'c'); //*q為cccccccccc
allc.construct(q++,"asdf"); //*q為asdf
. 當我們用完物件後,需要對每個構造的元素呼叫destroy來銷毀它們,也只能對真正構造的元素呼叫destroy函式,destroy接受乙個指標,對指向的物件呼叫析構函式:
while(q != p)
. 當元素被銷毀後,可以重新使用這部分記憶體儲存其他的string,也可以將其還給系統,釋放記憶體通過deallocate來完成:
allc.deallocate(p,n);
傳遞給deallocate的指標不能為空,必須指向allocate分配的記憶體,且n的值與其相同。
標準庫為allocator定義了兩個伴隨演算法,用於在未分配的記憶體中建立物件:
auto p = allc.allocate(v.size() * 2); //分配一塊比v所占用記憶體
auto q = uninitialized_copy(v.begin(),v.end(),p) //將v中的元素拷貝到p所指向記憶體的前一半,返回值是乙個指向最後乙個構造的元素之後位置的指標
uninitialized_fill_n(q,v.size(),42); //將剩餘元素初始化為42
C Primer第五版筆記 關聯容器
一 型別 關聯容器支援高效的關鍵字查詢和訪問,標準庫中兩個主要的關聯容器是map和set。map中的元素是鍵值對關鍵字表示索引。set中每個元素只包含乙個關鍵字,set支援高效的關鍵字查詢。關聯容器根據三個特性可以分為8種 1 set還是map 2 關鍵字是否可以重複,允許重複的容器名字中都包含單詞...
C Primer第五版筆記 拷貝控制
拷貝賦值函式 析構函式 三 五法則 default和阻止拷貝 乙個類通過定義五種特殊的成員函式來控制其拷貝 賦值 移動以及銷毀操作 拷貝建構函式 拷貝賦值運算子 移動建構函式 移動賦值運算子和析構函式。這些操作都是拷貝控制操作。當實現自己的類的時候要想好在做這些操作時的規則,因為編譯器通常會自動生成...
C Primer第五版筆記 虛函式
當我們使用基類的引用或指標呼叫乙個虛成員函式時會發生動態繫結,知道執行時才會知道到底呼叫了哪個版本的虛函式,因此所有的虛函式都必須有定義。對虛函式的呼叫可能在執行時才被解析 物件導向程式設計的核心思想是多型性 polymorphism 多型性這個詞源於希臘語,其含義是 多種形態 引用或指標的靜態型別...