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
代码:
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基本用法