天天看點

c++标準庫(筆記):智能指針(1) -- shared_ptr

自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所指對象的目前擁有者數量;