C++ Primer 筆記——動態數組

來源:互聯網
上載者:User

標籤:tor   不能   執行   自身   end   自動   引用   參數   []   

1.動態數組定義時也需要指明數組的大小,但是可以不是常量。

int i;int arr[i];    // 錯誤,數組的大小必須為常量int *p = new int[i];    // 正確,大小不必是常量


2.雖然我們通常稱 new T[ ] 分配的記憶體為動態數組,但我們並未得到一個數群組類型的對象,而是得到一個數組元素類型的指標。所以不能對動態數組調用begin或end,也不能用for語句來處理動態數組中的元素。

 

3.預設情況下,new分配的對象,不管是單個分配的還是數組中的,都是預設初始化的。我們可以用空括弧對數組中元素進行值初始化,但是不能在括弧中給出初始化器,這意味著不能用auto分配數組。

int *p = new int[3];    // 3個未初始化的intint *p1 = new int[10]();    // 3個值初始化為0的intint *p2 = new int[3]{ 1, 2, 3 };    // 列表初始化


4.雖然我們不能建立一個大小為0的靜態數組,但是可以動態分配一個空數組,此時new返回一個合法的非null 指標,此指標保證與new返回的其他任何指標都不相同。對於零長度的數組來說,此指標就像尾後指標一樣,我們可以從此指標減去自身從而得到0.但是此指標不能解引用。

 

5.我們可以用delete [ ] 來釋放數組,數組中的元素按逆序銷毀,並釋放對應的記憶體。

 

6.標準庫提供了一個可以管理new分配數組的unique_ptr版本。

std::unique_ptr<int[]> p(new int[3]);p[0] = 1;    // 為第一個元素賦值p.release();    // 自動用delete[]銷毀其指標

 


7.與unique_ptr不同,shared_ptr不直接支援管理動態數組,如果希望使用shared_ptr管理動態數組,必須提供自己定義的刪除器。shared_ptr未定義下標運算子,而且智能指標類型不支援指標算術運算。因此,為了訪問數組中的元素,必須用get擷取一個內建指標,然後用它來訪問數組元素。

std::shared_ptr<int> p(new int[10], [](int *p) {delete[] p; });    // 使用lambda釋放數組for (std::size_t i = 0; i != 10; ++i)    *(p.get() + i) = i;    // 使用get擷取一個內建指標

 

8.allocator是一個模板,它協助我們將記憶體配置和物件建構分離開來,分配的記憶體是原始的,未構造的,當一個allocator對象分配記憶體時,會根據給定的物件類型來確定恰當的記憶體大小和對齊位置。

std::allocator<std::string> alloc;    // 可以分配string的allocatorauto const p = alloc.allocate(3);    // 分配n個未初始化的stringauto q = p;                        // q指向最後構造的元素之後的位置alloc.construct(q++);            // *q為空白字串alloc.construct(q++, 2, ‘c‘);    // *q為"cc"alloc.construct(q++, "test");    // *q為"test"std::cout << *p << std::endl;    // 正確,p指向第一個構造的元素std::cout << *q << std::endl;    // 錯誤,q指向未構造的記憶體while (q != p)    alloc.destroy(--q);        // 執行了指向對象的解構函式 // 元素被銷毀後我們可以重新用這部分記憶體構造新對象,也可以將其歸還給系統:alloc.deallocate(p, 3);    // 注意這裡的p不可為空,而且大小參數必須與分配時一樣

 

9.標準庫還為allocator類定義了兩個伴隨演算法,可以在未初始化記憶體中建立對象。

 

C++ Primer 筆記——動態數組

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.