自c++11起,c++标準庫提供了兩大類型的智能指針
1、shared_ptr
2、unique_ptr
這兩個類被定義在<memory>内
shared_ptr:當對象再也不被使用時就被清理
建立shared_ptr:
shared_ptr<string> pNico(new string("nico"));
也可以使用make_shared:
shared_ptr<string> pJutta = make_shared<string>("jutta");
還可以先聲明再指派,但不能使用指派運算符,必須改用reset:
shared_ptr<string> pNico;
pNico.reset(new string("nico"));
shared_ptr可以聲明屬于自己的Deleter:
shared_ptr<string> pNico(new string("nico"), [](string* p){cout << "delete" << *p
<< endl; delete p;}
pNico = nullptr;
如果在最後一個對象結束後,而清理工作不僅僅是删除記憶體,則必須明确自己給出的deleter,可
以指定屬于自己的析構政策。
std::shared_ptr<std::ofstream> fp(new std::ofstream("tmpfile.txt"), FileDeleter
("tmpfile.txt"));
FileDeleter是一個函數,當最後一個對象要結束生命的時候,由他删除記憶體并删除tmpfile.txt
檔案
注1:由于接受單一pointer作為唯一實參的構造函數是explicit,是以不能夠使用指派符,那樣
的話會被視為需要一個隐式轉換。然而新式初始化文法(清單初始化)是被接受的
shared_ptr<string> pNico = new string("nico"); //error
shared_ptr<string> pNico{new string("nico")}; //ok
注2:shared_ptr不提供operator[]以及指針運算,隻提供operator*和operator->,是以,想訪
問記憶體,必須使用get()擷取被shared_ptr包裹的内部指針:
smp.get()[i];
注3:關于array的應用:
std::shared_ptr<int> p(new int[10]); //error,預設構造器提供的是delete而不是delete[]
可以通過自己定義一個deleter:
std::shared_ptr<int> p(new int[10],[](int* p){delete[]p;});
也可以使用為unique_ptr提供的輔助函數作為deleter:
std::shared_ptr<int> p(new int[10], std::default_delete<int[]>());
其他的應用:
調用use_count()檢視shared pointer所指對象的目前擁有者數量;