動態陣列 allocator 類

2022-03-29 14:28:12 字數 1208 閱讀 1963

12.2 動態陣列

12.2.1 new 和陣列

1.分配乙個動態陣列即是在分配乙個new物件時在型別名之後加一對方括號,用來存放陣列大小,該數可以是任意表示式、也可以是0,只需是整形、無需是常量。陣列分配成功後返回乙個指向第乙個物件的指標。

2.該分配的動態陣列並非是陣列型別,也就不能呼叫陣列的begin和end函式,更不能使用需要begin函式的範圍for語句。

3.我們可以在方括號後面跟一對空括號,來對陣列進行值初始化,空括號內不能給出初始化器,從而也就不能用auto來分配陣列了(因為auto需要通過初始化器來推斷陣列型別),但是我們可以用乙個初始值列表來代替空括號,列表裡的初識值用來初始化陣列,但是初始值的數量不能大於陣列大小。

4.釋放動態陣列用delete[ ]p,[ ]必不可少。

5.除了可以通過下標運算子訪問陣列還可以通過此for迴圈來訪問陣列:for(int * q = p; q != p + n; ++q)

6.用智慧型指標unique_ptr管理動態陣列:定義時需指明陣列大小且需在物件型別後面跟一對空方括號,以示分配的記憶體為陣列,例如:unique_ptrup(new int[10];該智慧型指標接受下標運算子來訪問陣列元素。 for (size_t i = 0; i != 10; ++i)   up[i] = i;

釋放該陣列則呼叫release()成員函式,該函式會自動使用delete來釋放記憶體。

7.如果要用shared_ptr來管理動態記憶體,則需提供自己的刪除器:例如:

shared_ptrsp(new int[10], (int *p) );釋放該陣列用reset()函式。

該智慧型指標不支援下標操作,訪問則需用get()函式返回乙個內建指標for (size_t i = 0; i != 10; ++i)      *(sp.get() + i) = i;

12.2.2 allocator 類

1.allocator允許使用者先分配記憶體,再構造物件,分配記憶體用a.allocate(n),該函式返回乙個指向首個記憶體的指標,構造物件用a.contrucr(q++, args),args可以是所構造物件型別的任意建構函式的引數列表。

2.使用或訪問記憶體之前必須構造物件

3.a.destroy(q)用來釋放物件,而非釋放記憶體,因為是釋放物件,所以只有構造了物件的記憶體才能用此函式,,釋放記憶體用a.deallocate(p, n),n必須和所分配的記憶體數量大小相等,且釋放記憶體之前必須釋放物件。

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

第十二章動態記憶體 allocator類

new和delete的兩部分操作 記憶體分配 釋放 和物件構造 析構 當分配一大塊記憶體時,我們計畫在這塊記憶體上按需構造物件,在此情況下希望記憶體分配和物件構造分離。這表示 我們可以分配大塊記憶體,但是只有真正需要時才執行物件建立操作 同時付出一定開銷 將記憶體分配和物件構造組合在一起可能會導致不...

動態陣列類 例

定義一元素為整數的動態陣列類,並在主函式中呼叫各個功能 資料成員 指向元素首位址的指標 用於儲存動態申請的陣列空間 當前陣列的容量 當前元素的個數 成員函式 帶參 無參建構函式 無參的動態申請10個元素空間並改變當前陣列的容量 當前元素的個數值 帶參的按引數處理 在尾部增加一元素 修改指定位置上的元...

動態陣列類的封裝

標頭檔案 ifndef myarray h define myarray h include using namespace std class array void array free bool array invalidateindex int nindex 引數berase為true時,重繪...