C++基礎回顧4——動態陣列

愛上冰激凌發表於2018-06-06

C++語言庫提供兩種一次分配一個物件陣列的方法:
1.new表示式語法——分配記憶體和初始化一起
2.allocator類,分配和初始化分離。

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

    //初始化動態分配物件的陣列
    int *pia = new int[10];
    int *pia = new int[10]();
    int *pia = new int[10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

new分配一個int陣列,並返回指向第一個int的指標。雖然。通常new T[]分配的記憶體為“ 動態陣列”,但當new分配一個陣列時,返回的並不是一個陣列型別的物件,而是一個指向陣列元素型別的指標,即分配一個陣列會得到一個元素型別的指標。

釋放動態陣列,例子如下,delete陣列是需要加[],delete單一物件時不需要[],unique_ptr對於動態陣列的釋放使用delete。

    delete p; //p必須指向一個動態分配的物件或為空
    delete [] pia; //pia必須指向一個動態分配的陣列或為空
    unique_ptr<int []> up(new int[10]);
    up.release(); //自動用delete[]銷燬其指標

與unique_ptr不同,shared_ptr不直接支援管理動態陣列,如果希望shared_ptr管理一個動態陣列,必須提供自己定義的刪除器。

//為了使用shared_ptr,必須提供一個刪除器
    shared_ptr<int> sp(new int[10], [] (int *p){delete[] p;} );
    sp.reset();

allocator類
為了定義一個allocator物件,必須指明這個allocator可以分配的物件型別,當一個allocator物件分配記憶體時,它會根據給定的物件型別來確定恰當的記憶體大小和對齊位置:

    allocator<string> alloc;    //分配string型別的allocator物件
    auto const p = alloc.allocate(10);    //分配n個未初始化的string
    auto q = p;
    alloc.construct(q++);  //*q為空指標
    alloc.construct(q++, 10, 'c');  //*q為ccccccccc
    alloc.construct(q++, "hi");   //*q為hi

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

標準庫allocator類及其演算法

  • allocator〈T〉 a:
  • a.allocate(n)
  • a.deallocate(p, n)
  • a.construct(p, args)
  • a.destory(p)
  • unintialized_copy(b, e, b2)
  • unintialized_copy_n(b, n,b2)
  • unintialized_fill(b, e, t)
  • unintialized_fill_n(b, n, t)

相關文章