动态内存
使用動態(tài)生存期的資源的類:
1,程序不知道自己需要使用多少對象;——容器
2,程序不知道所需對象的準確類型;——模板
3,程序需要在多個對象間共享數據。——動態(tài)內存
動態(tài)內存:
new,在動態(tài)內存中為對象分配空間并返回一個指向該對象的指針。
delete,接受一個動態(tài)對象的指針,銷毀該對象,并釋放與之關聯的內存。我們傳遞給delete的指針必須指向動態(tài)分配的內存,或者是一個空指針。釋放一塊并非new分配的內存,或者將相同的指針值釋放多次,其行為是未定義的。注意空懸指針。
一個unique_ptr“擁有”它所指向的對象,與shared_ptr不同,某個時刻只有有一個unique_ptr指向一個給定對象,定義一個unique_ptr時,需要將其綁定到一個new返回的指針上,由于一個unique_ptr擁有它所指向的對象,因此unique_ptr不支持普通股的拷貝或賦值操作。
weak_ptr是一種不控制所指向對象生存期的智能指針,它指向一個shared_ptr管理的對象。
當我們創(chuàng)建一個weak_ptr時,要用一個shared_ptr來初始auto
wp弱共享;p的引用計數不改變,正是這一點是弱引用。
由于對象可能不存在,我們不能使用weak_ptr直接訪問對象,而必須調用lock.
{//如果np不為空則條件成立//在if中,np與p共享對象 }動態(tài)數組:1,new 2,allocator將分配和初始化分離,
1,int *pia=new int[get_size()]; //pia指向第一個int
typedef int arrT[42]; //表示數組類型的類型別名來分配一個數組
int *p=new arrT;
delete [] p;
標準庫提供了一個可以管理new分配的數組的unique_ptr版本,為了用一個unique_ptr管理動態(tài)數組,我們必須在對象類型后面跟一對空方括號:
//up指向一個包含10個未初始化int的數組
與unique_ptr不同(可以直接使用下標運算符),shared_ptr不直接支持管理數組,如果希望使用shared_ptr管理一個動態(tài)數組,必須提供自己定義的刪除器:
sp.reset(); // 使用我們提供的lambda釋放數組,它使用delete[]2,allocator類,allocator是一個模板,當一個allocator對象分配內存時,它會根據給定的對象類型來確定恰當的內存大小和對齊位置:
allocator<string> alloc; //可以分配string的allocator對象 auto const p =alloc.allocate(n); //分配n個未初始化的string,為n個string分配了內存。標準庫allocator類及其算法
allocator<T> a a.allocate(n) a.deallocate(p,n) a.construct(p,args) a.destroy(p) unintialized_copy(b,e,b2) unintialized_copy_n(b,n,b2) unintialized_fill(b,e,t) unintialized_fill_n(b,n,t)總結
- 上一篇: Share memory中bank co
- 下一篇: 拷贝控制