c++循环引用解决
#include <iostream>
#include <vector>
#include <memory>
class parent;
class children;
class parent
{
public:
~parent() { std::cout << "~parent()" << std::endl; }
public:
std::shared_ptr<children> child;
};
class children
{
public:
~children() { std::cout << "~children()" << std::endl; }
public:
std::shared_ptr<parent> parent;
};
void Verify()
{
std::shared_ptr<parent> p(new parent);
std::shared_ptr<children> c(new children);
p->child = c;
c->parent = p;
// p->child.reset(); 手动打破循环
}
int main()
{
std::cout << "Begin" << std::endl;
Verify();
std::cout << "Done" << std::endl;
}
上述代码中,parent有一个shared_ ptr类型的成员指向孩子,而child也有一个shared_ ptr
类型的成员指向父亲。然后在创建孩子和父亲对象时也使用了智能指针c和p,随后将c和p分
别又赋值给child的智能指针成员parent和parent的智能指针成员child.从而形成了一个循
环引用:
解决方法1 手动打破循环
当我们想要parent对象释放时,children对象中仍保留了该parent对象的shared_ptr,导致其无法被正常释放。
既然是因为children对象保留了引用,那么就先释放children对象呗?同理先手动reset()parent也行
使用weak_ptr
为了解决循环引用导致的内存泄漏,引入了weak_ ptr 弱指针,weak_ ptr的构造函数不会修
改引用计数的值,从而不会对对象的内存进行管理,其类似-一个普通指针,但不指向引用计数的
共享内存,但是其可以检测到所管理的对象是否已经被释放,从而避免非法访问。
就是用weak_ptr打破循环
本文作者:可可爱爱奇奇怪怪。。。
本文链接:https://www.cnblogs.com/ccsuf/p/16169925.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。