標籤:

《C++ Primer》讀書筆記-第十二章 02 動態數組

聲明:

  • 文中內容收集整理自《C++ Primer 中文版 (第5版)》,版權歸原書所有。
  • 原書有更加詳細、精彩的釋義,請大家購買正版書籍進行學習。
  • 本文僅作學習交流使用,禁止任何形式的轉載

正文

一次為很多對象分配動態內存

  1. new動態數組
  2. allocator

NOTE: 大多數應用應該使用標準庫容器而不是動態分配的數組。使用容器更為簡單、更不容易出現內存管理錯誤並且可能有更好的性能。

new和數組

int *pia = new int[get_size()];

  1. 類型名後跟一對方括弧,指明要分配的對象的數目,方括弧中的大小必須是整型,但不必是常量。
  2. 返回指向第一個元素的指針

也可以使用類型別名

typedef int arrT[42]; int *p = new arrT;

要注意,new T[] 返回的是指向首元素的指針而不是數組,這意味著我們無法使用begin、end之類的操作

初始化

  • 默認初始化
  • 值初始化(方括弧後加一對空括弧)
  • 列表初始化(花括弧列表)

int *pia2 = new int[10](); int *pia3 = new int[10]{1,2,3,4};

如果

  1. 初始化器數目小於元素數目,剩餘元素將進行值初始化
  2. 初始化器數目大於元素數目,new表達式失敗,不分配任何內存,拋出一個bad_array_new_length異常

動態分配一個長度為0的數組是合法的

char arr[0];//錯誤 char *cp = new char[10];//正確

此時返回一個合法的非空指針

size_t n = get_size(); int *p = new int[n]; for(int *q = p; q != p+n; ++q) { }

如果get_size返回0,上面的代碼仍能正確執行

釋放動態數組

delete [] pa;

  1. 銷毀pa指向的數組中的元素
  2. 釋放對應的內存
  3. 逆序銷毀

智能指針和動態數組

unique_ptr<int []> up(new int[10]);

必須在尖括弧中類型名後加一對空的方括弧

up.release();

自動調用delete [] 銷毀其指針

和普通unique_ptr的區別

  1. 不能使用點和箭頭成員運算符
  2. 可以使用下標來訪問數組中的元素

for(size_t i = 0; i != 10; ++i) { up[i] = i; }

shared_ptr不直接支持管理動態數組,參考p426來使用

allocator類

定義在memory頭文件中

將內存分配和對象構造分離開來

allocator<string> alloc; auto const p = alloc.allocate(n);

為n個string分配了內存,分配的內存是未構造的

可以使用construct函數來構造

allocator<T> a; a.construct(p, args);

類似於make_shared,args傳遞給構造函數來創建對象

alloc.construct(p++); alloc.construct(p++, 10, c);

實際上,應當p進行緩存,以便訪問已經構造的元素

auto q = p; alloc.construct(q++); alloc.construct(q++, 10, c);

p指向起始位置,q指向下一個待構造的位置

用完後,必須對每個構造的元素調用destroy來銷毀它們

while(q != p) { alloc.destory(--q); }

銷毀後,可以重新使用這部分內存,也可以釋放

alloc.deallocate(p, n);

n必須與分配內存時提供的大小一樣

copy和fill演算法

uninitialized_copy(b, e, b2);

從迭代器範圍[b,e)中拷貝元素到迭代器b2指定的未構造的原始內存中。b2指向的內存必須足夠大。

uninitialized_copy_n(b,n,b2); uninitialized_fill(b,e,t); uninitialized_fill_n(b,n,t);

具體用法參考P429例子

END

微信公眾號, 馬志峰的編程筆記

專註做好一件事,每天早起學習編程1.5小時並輸出筆記。

與其去羨慕高手裝逼,不如來見證菜鳥成長!


推薦閱讀:

GeekBand C++面向對象高級編程(上)1
C++中的deleting destructor
static_cast<const char*>("Fuck GTK+")

TAG:C |