c++ 智能指針初步用法 unique_ptr/shared_ptr/weak_ptr
auto_ptr淺拷貝,帶來很多問題,已經(jīng)廢棄
1. unique_ptr:內(nèi)存的所有者或者說管理者必須是唯一的,如進(jìn)入不同的模塊或者調(diào)用者,那么執(zhí)行所有權(quán)轉(zhuǎn)移,通過release釋放。
Student* p = new Student("lily");
??????? std::unique_ptr<Student> unique_p(p);
??????? unique_p.release(); // 使得unique_p釋放控制器,下一步才可將p的控制權(quán)交給unque_p2
??????? std::unique_ptr<Student> unque_p2(p); // 否則會(huì)
??????? std::unique_ptr<Student> unque_p2(unique_p);??? // 錯(cuò)誤,不能拷貝構(gòu)造,因?yàn)楹瘮?shù)已經(jīng)刪除

??????? std::unique_ptr<Student> unque_p2(std::move(unique_p)); // 移動(dòng)構(gòu)造可以,讓unique_p為空
2. shared_ptr: 內(nèi)存由多個(gè)指針變量共同使用,共同擁有內(nèi)存的所有權(quán),但是必須杜絕循環(huán)拷貝!并且 shared_ptr 需要維護(hù)的信息有兩部分:指向共享資源的指針;引用計(jì)數(shù)等共享資源的控制信息——維護(hù)一個(gè)指向控制信息的指針。
Student a;
??? std::shared_ptr<Student> ptra = std::make_shared<Student>(a);
??? std::shared_ptr<Student> ptra2(ptra);???? //拷貝構(gòu)造函數(shù)
??? std::cout << ptra.use_count() << std::endl;?? //2
??? ptra2 = nullptr;
??? std::cout << ptra.use_count() << std::endl;?? //1
??? ptra = nullptr;
??? std::cout << ptra.use_count() << std::endl;?? //0
當(dāng)引用計(jì)數(shù)為0的時(shí)候,則調(diào)用delete,釋放資源:

3. weak_ptr: 對(duì)內(nèi)存的使用僅僅是訪問而已,不涉及其生命周期的管理,資源的釋放只取決shared的計(jì)數(shù),當(dāng)計(jì)數(shù)為0時(shí),釋放資源,weak_ptr不控制資源的生命周期。
?// 解決循環(huán)引用
??? {
??????? std::shared_ptr<WeakNode> sp1(new WeakNode);
??????? std::shared_ptr<WeakNode> sp2(new WeakNode);
??????? sp1->next_ = sp2;
??????? sp2->pre_ = sp1;
??? }
class WeakNode
{
public:
?? ?int data_;
?? ?std::shared_ptr<WeakNode> pre_;
?? ?std::shared_ptr<WeakNode> next_;
?? ?~WeakNode()
?? ?{
?? ??? ?std::cout << "destruct..." << std::endl;
?? ?}
};

將成員pre_ 或 next_改為:weak_ptr類型即可:
class WeakNode
{
public:
?? ?int data_;
?? ?// 2個(gè)成員 一個(gè)改為 weak_ptr即可解決循環(huán)引用
?? ?std::weak_ptr<WeakNode> pre_;
?? ?std::shared_ptr<WeakNode> next_;
?? ?~WeakNode()
?? ?{
?? ??? ?std::cout << "destruct..." << std::endl;
?? ?}
};
改造后,解決循環(huán)引用,可以釋放:
