1. 程式人生 > >動態數組

動態數組

數組 unique string code 析構 調用 destory 自定義 逆序

方式一:

int *p = new int[10];    //分配一個一塊存儲類型為int的連續內存,返回的是這塊連續內存的首地址。以默認初始化的方式初始化,內置類型的話,值是隨機的。
int *p = new int[10]();     //將開辟的內存中的值全都初始化為0
int *p = new int[10]{0,1,2,3,4,5,6,7,8,9};    //使用花括號(這裏其實叫初始化器)中的值初始化新開辟的內存中的值。初始化器中值的數目可以小於動態數組的大小,那麽不夠的地方將默認初始化。但是初始化器中的值不能多於動態數組的大小,會拋出一個bad_array_new_length的異常。

  註:動態數組(new出來的數組)其實不是數組,因為我們最終得到不是一個數組對象,而是得到一個數組元素類型的指針。所以不能對動態數組使用begin函數和end函數。

  動態分配一個空數組(int *p = new int[0])是合法的,此時new返回一個合法的非空指針,但是不能對這個指針解引用,畢竟它不指向任何有效元素。

  釋放動態數組:

int *pArray = new int[10]();
if(pArray != nullptr)
{
    delete [] pArray;    //動態數組中的元素逆序銷毀,先銷毀最後一個元素,最後銷毀的是第一個元素,釋放動態數組時,方括號是必須的。
    pArray = nullptr;
}

方式二:

  標準庫提供了一個可以管理new分配的數組的unique_ptr版本,為了用一個unique_ptr管理一個動態數組,必須在對象後面跟一個方括號:

unique_ptr<int[]> p(new int[10]);
std::cout << p[0] << std::endl; p.release();
//使用delete []自動釋放動態數組

  當unique_ptr指向的是一個動態數組的時候,需要用下標運算來訪問元素。

  shared_ptr不直接支持管理動態數組,如果希望使用shared_ptr管理動態數組,必須提供一個自定義的刪除器。shared_ptr不直接支持管理動態數組,所以使用自定義刪除器來管理動態數組的時候,不能用下標訪問數組元素,而是需要通過get()方法獲得內置指針的方式來訪問元素。

方式二:

  new將內存分配和對象構造組合在了一起,delete將對象析構和內存釋放組合在了一起。但這可能會造成浪費,比如,string *p = new string[100];我們可能只用到了其中一部分string,另外,string的賦值進行了兩次,一次是new的時候構造的同時默認初始化,另一次是真正使用的時候進行的賦值;還有我們不能為沒有默認構造函數的類使用new。

  allocator類在頭文件memory中,它將內存的分配和對象的構造分離開來,它構造出的內存是原始的、沒有被構造的。allocator也是一個模板。

allocator<T> a 定義一個名為a的allocator的對象,它可以為類型為T的對象分配內存
a.allocate(n) 分配一段原始的、未構造的內存,保存n個數據類型為T的對象
a.deallocate(p,n) 釋放從T* 指針p 中地址開始的內存,這塊內存保存了n個類型為T的對象,p必須是一個由先前allocate返回的指針,而且n必須是p創建時所要求的大小,在調用deallocate之前,用戶必須對每個在這塊內存中創建的對象調用destory
a.constrcut(p,args) p必須是一個類型為T* 的指針,指向一塊原始內存;args被傳遞給類型為T的構造函數,用來在p指向的內存中構造一個對象
a.destory(p) p為T*類型的指針,此算法對p所指向的對象執行析構函數

  

動態數組