《C++ Primer》讀書筆記-第十二章 02 動態數組
聲明:
- 文中內容收集整理自《C++ Primer 中文版 (第5版)》,版權歸原書所有。
- 原書有更加詳細、精彩的釋義,請大家購買正版書籍進行學習。
- 本文僅作學習交流使用,禁止任何形式的轉載
正文
一次為很多對象分配動態內存
- new動態數組
- allocator
NOTE: 大多數應用應該使用標準庫容器而不是動態分配的數組。使用容器更為簡單、更不容易出現內存管理錯誤並且可能有更好的性能。
new和數組
int *pia = new int[get_size()];
- 類型名後跟一對方括弧,指明要分配的對象的數目,方括弧中的大小必須是整型,但不必是常量。
- 返回指向第一個元素的指針
也可以使用類型別名
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};
如果
- 初始化器數目小於元素數目,剩餘元素將進行值初始化
- 初始化器數目大於元素數目,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;
- 銷毀pa指向的數組中的元素
- 釋放對應的內存
- 逆序銷毀
智能指針和動態數組
unique_ptr<int []> up(new int[10]);
必須在尖括弧中類型名後加一對空的方括弧
up.release();
自動調用delete [] 銷毀其指針
和普通unique_ptr的區別
- 不能使用點和箭頭成員運算符
- 可以使用下標來訪問數組中的元素
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 |
