C++:shared_ptr

Posted 编程不止是语言

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++:shared_ptr相关的知识,希望对你有一定的参考价值。

shared_ptr真的不写什么面试题,但是每次面试都会遇到,不得不下笔写了。

智能指针的循环引用,理解对象的声明周期,大概就理解了。A有B的实例,A释放的时候B得先释放,B有A的实例,B释放的时候得先释放A,导致谁都释放不了,造成内存泄漏了。

常见面试题

1.智能指针交换的时候线程安全吗?

2.引用计数的变量是针对类的还是针对对象的?只针对类的,类拥有的

3.循环引用

本文只讨论3:

解决循环引用:

1.当A生存期超过child的时候,child改成普通指针,手动释放内存

2.使用weak_ptr

代码:

#include <iostream>#include <memory>
class Man;class Woman {private: //std::weak_ptr<Man> _husband; std::shared_ptr<Man> _husband;public: void setHusband(std::shared_ptr<Man> man) { _husband = man; } ~Woman() { std::cout << "kill woman\n"; } void printA(){ std::cout << "printA" << std::endl; }};
class Man {private: std::weak_ptr<Woman> _wife; //std::shared_ptr<Woman> _wife;public: void setWife(std::shared_ptr<Woman> woman) { _wife = woman; }
void doSomthing() { if (_wife.expired() == false) //查看引用计数 { auto w = _wife.lock(); //得到一个shared_ptr对象 w->printA(); } }
~Man() { std::cout << "kill man\n"; }};
int main(int argc, char** argv) { std::shared_ptr<Man> m(new Man()); std::shared_ptr<Woman> w(new Woman()); if (m && w) { m->setWife(w); w->setHusband(m);
m->doSomthing(); } return 0;}

weak_ptr不增加资源的引用计数,那么在使用weak_ptr对象的时候,资源被突然释放了怎么办呢?答案是你根本不能直接通过weak_ptr来访问资源。在需要访问资源的时候weak_ptr的lock为你生成一个shared_ptr。具体见以上代码。


以上是关于C++:shared_ptr的主要内容,如果未能解决你的问题,请参考以下文章

C++ std::shared_ptr 将初始化类中的其他成员数据

如何将 shared_ptr 变量推回 C++ 中的 shared_ptr 向量?

C++笔记-auto_ptr&unique_ptr&shared_ptr&shared_ptr基本用法

C++笔记-auto_ptr&unique_ptr&shared_ptr&shared_ptr基本用法

C++笔记-auto_ptr&unique_ptr&shared_ptr&shared_ptr基本用法

C++ 11 创建和使用 shared_ptr