new和delete運算子一次只分配/釋放乙個物件,但是某些應用需要以此為很多物件分配記憶體的功能。
c++中制定了兩種分配/釋放多個物件的機制!分別是:new/delete 和 allocator類。
其中new/delete 再分配記憶體的時候就初始化物件;
allocator類將記憶體的分配和物件的初始化分離。
類似於預載入和懶載入。
new的初始化
int * p = new int[get_size()];
int * q = new int[100];//預設初始化,100個未初始化的int
int * s = new int[100](); //值初始化,100個0
int * m = new int[10]; //1,2,3,4,5,6,7,8,9,0(0是值初始化)
花括號列表形式的初始化器用來初始化動態陣列的開始部分元素。如果初始化器給出的元素大於總的元素數目,則new表達是會出錯,不會分配任何記憶體。當小於總的元素數目的時候,後面的剩餘元素將會進行值初始化。
delete 釋放動態陣列
typedef arrt[100] int ;
int * p = new arrt;
delete p;
當我們釋放乙個指向陣列的指標的時候,空括號是必須的。因為:它指示編譯器此指標指向乙個物件陣列的第乙個元素!如果我們忽略了方括號,其行為是未定義的。
陣列的元素的銷毀是逆序的。最後乙個元素首先被銷毀,然後是倒數第二個,以此類推。
unique_ptr
unique_ptrp(new int[100]()); //分配
p.reset() ; //釋放
unique_ptr使用下標訪問陣列中的元素
unique_ptrup(new int[10]);
for(size_t i = 0;i != 10;i++)
shared_ptr 未定義下標運算子,不能通過下標來訪問陣列元素。因此是不支援管理乙個動態陣列的。但是如果我們需要進行這種操作就必須要給它傳遞乙個刪除器;
shared_ptrsp(new int[10],(int* p));
sp.reset(); // 使用lambda作為刪除器,釋放陣列
shared_ptr 使用get()訪問陣列元素;
for(size_t i = 0;i != 10;++i)
allocator類 primer p428
其實很簡單,將記憶體的建立+物件的構造分離開來;也就是將 物件的析構+記憶體的釋放分離開來!
記憶體建立:allocate()然後返回第乙個元素的起始位址
物件的構造:construct() 引數一 位置指標,引數二 物件
物件的析構:destory() 傳遞指標
記憶體釋放:deallocate() //傳遞給deallocate的指標必須是之前某次allocate返回的指標,因此在deallocate之前我們必須要檢查該指標是否為空
舉個栗子:
#include #include using namespace std;
class animal
#endif
animal(int _num) : num(_num)
~animal()
void show()
private:
int num;
};int main()
//物件銷毀之後還可以繼續構建,因為構建和記憶體的分配是分離的
//6.
alloc.deallocate(a, 5);
cin.get();
return 0;
}
輸出
animal constructor param
animal constructor default
animal constructor param
animal constructor default
animal constructor param10
305animal destructor
animal destructor
animal destructor
animal destructor
animal destructor
3 4 陣列的拷貝函式
函式arraycopy src,srcpos,dest,destpos,length 呼叫方法 system.arraycopy src,srcpos,dest,destpos,length 利用陣列拷貝方法實現簡易的陣列刪除元素,陣列擴容,向陣列中插入元素這三個功能。利用陣列拷貝,實現陣列刪除元素...
3 4 多陣列中位數
題目描述 給定兩個有序陣列arr1和arr2,兩個陣列長度都為n,求兩個陣列中所有數的上中位數。例如 arr1 arr2 一共8個數則上中位數是第4個數,所以返回3。arr1 arr2 一共6個數則上中位數是第3個數,所以返回2。要求 時間複雜度o logn 1 2 思路 二分思路 3首先分別找出兩...
usaco 3 4 rockers 動態規劃
f disk song ti 表示用前disk張光碟,錄製前song首歌曲 不一定錄製第song首歌曲 的最大曲目數,並且當前在錄的光碟剩餘時間是ti f disk song ti max f disk song 1 ti f disk 1 song 1 t a song disk 1 a song...