標籤:
C++沒有提供記憶體回收機制,C++11提供的智能指標能夠在一定程度上解決C++記憶體流失的問題。
C++11提供了共用智能指標(shared_ptr),獨佔智能指標(unique_ptr),弱引用指標指標(weak_ptr),使用時需要引用<memory>
智能指標本質上儲存動態分配(堆)對象的指正的模板類,用於對堆對象的生存期進行控制,確保在離開指標範圍時,能夠自動正確的銷毀動態分配的堆對象,
防止堆記憶體流失。
1. std::shard_ptr通常用於多個智能指標同時使用同一個記憶體資源時,它的內部使用引用計數計數,每次使用它一次,內部引用數增加1;反之,析構一次,引用計數減1;
減為0時,刪除所指向的堆記憶體。
1.1初始化:推薦使用make_shared<T>
std::shared_ptr<int> p1(new int(1)); //建構函式初始化auto p2=std::make_shared<int>(1); //make_shared<T>//std::shared_ptr<int> p2=std::make_shared<int>(1);int *pi=new int(1);std::shard_ptr<int> p3(pi);
1.2使用方法與普通的原始指標相同
if(p1) //判斷shared_ptr是否為空白{ std::cout<<"p1 is not null"<<endl; cout<<*p1<<endl; //擷取指標指向對象的值
}
int *p=p1.get(); //擷取原始指標
1.3shared_ptr的最大的一個陷阱是循環參考,循環參考會導致堆記憶體無法正確釋放,導致記憶體流失。
下面是典型的執行個體,測試表明堆對象並沒有釋放,只是引用計數由2減少為1
#include <iostream>#include <memory>struct A;struct B;struct A{ std::shared_ptr<B> bptr; A(){std::cout<<"A is created"<<std::endl;} ~A(){std::cout<<"A is deleted!"<<std::endl;}};struct B{ std::shared_ptr<A> aptr; B(){std::cout<<"B is created!"<<std::endl;} ~B(){std::cout<<"B is deleted!"<<std::endl;}};std::weak_ptr<A> wpa;void testPtr(){ std::shared_ptr<A> ap(new A); std::shared_ptr<B> bp(new B); ap->bptr=bp; bp->aptr=ap; wpa=ap; //weak_ptr擷取當前觀測資源的引用計數 std::cout<<wpa.use_count()<<std::endl; //ouput 2}int main(){ testPtr(); std::cout<<wpa.use_count()<<std::endl; //output 1return 0;}
2.unique_ptr用於只有一個智能指標管理資源或者管理數組;
它是一個獨佔型的智能指標,它不予許其他的智能指標共用同一塊記憶體。
不予許通過賦值將一個unique_ptr給另外一個unique_ptr.
通過std::move函數轉移堆對象的所有權
std::unique_ptr<int> ptri1(new int(1)); //std::unique_ptr<int> ptri2=ptri1; // 不能賦值std::unique_ptr<int> ptri2= std::move(ptri1); //轉移所有權//std::cout<<*ptri1<<std::endl; //失去所有權std::cout<<*ptri2<<std::endl; //獲得所有權
註:unique_ptr除了獨佔性外,unique還可以指向一個數組
//std::shared_ptr<int []> ptr3(new int[10]);
std::unique_ptr<int []> ptr4(new int[10]);
ptr4[9]=9;
3.weak_ptr:用於監視shared_ptr,它不管理shared_ptr內部的指標,
沒有重載*和->,不共用指標,不能操縱資源。
1)通過use_count(),擷取當前觀測資源的引用計數。執行個體見上
2)通過expired()方法判斷資源是否釋放
if(wp.expired())
{
std::cout<<"not expired!"<<endl;
}
3)lock()方法可以擷取監視的shared_ptr對象
C++11 智能指標