boost的shared_ptr循环引用

boost的智能指针给编程带来了极大的便利,不需要关心内存的释放,不要要调用delete,而且还可以定制delete的方法。其实boost的智能指针是可以当成scope_exit来用的,同样是退出时处理。但是凡事都是有利有弊,boost的shared_ptr如果在循环引用的时候会出现无法释放内存的情况,所谓循环引用就是A智能指针类里存放B的智能指针,B的智能指针类里存放A,将a、b的值互相设置。增加引用计数,在释放的时候由于计数问题,会导致在退出指针域的时候无法进行释放,解决该问题的方案是在类成员中使用弱指针。见如下例子

// circleRef.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

#include <iostream>
#include <boost/shared_ptr.hpp>
#include <boost/weak_ptr.hpp>

using namespace std;

class ObjectB;

class ObjectA
{
public:
	~ObjectA()
	{
		std::cout<<"dctor ~ObjectA"<<std::endl;
	}

	void setObjectB(boost::shared_ptr<ObjectB> b)
	{
		m_objB = b;
	}
private:
	boost::shared_ptr<ObjectB> m_objB;
};

class ObjectB
{
public:
	~ObjectB()
	{
		cout<<"dctor ~ObjectB"<<endl;
	}

	void setObjectA(boost::shared_ptr<ObjectA> a)
	{
		m_objA = a;
	}
private:
	boost::shared_ptr<ObjectA> m_objA;
};

void test()
{
	boost::shared_ptr<ObjectA> a(new ObjectA);
	boost::shared_ptr<ObjectB> b(new ObjectB);

	a->setObjectB(b);
	b->setObjectA(a);
};

int _tmain(int argc, _TCHAR* argv[])
{
	test();
	printf("test ");
	getchar();
	return 0;
}

程序执行,不会调用各自的析构函数。若将其改为weak_ptr则不会引入多余计数的问题,从而可以保证对象被正确释放,看如下修改后的正确代码:

// circleRef.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

#include <iostream>
#include <boost/shared_ptr.hpp>
#include <boost/weak_ptr.hpp>

using namespace std;

class ObjectB;

class ObjectA
{
public:
	~ObjectA()
	{
		std::cout<<"dctor ~ObjectA"<<std::endl;
	}

	void setObjectB(boost::shared_ptr<ObjectB> b)
	{
		m_objB = b;
	}
private:
	boost::weak_ptr<ObjectB> m_objB;
};

class ObjectB
{
public:
	~ObjectB()
	{
		cout<<"dctor ~ObjectB"<<endl;
	}

	void setObjectA(boost::shared_ptr<ObjectA> a)
	{
		m_objA = a;
	}
private:
	boost::weak_ptr<ObjectA> m_objA;
};

void test()
{
	boost::shared_ptr<ObjectA> a(new ObjectA);
	boost::shared_ptr<ObjectB> b(new ObjectB);

	a->setObjectB(b);
	b->setObjectA(a);
};

int _tmain(int argc, _TCHAR* argv[])
{
	test();
	printf("test ");
	getchar();
	return 0;
}

boost的shared_ptr循环引用,布布扣,bubuko.com

时间: 2024-10-09 06:40:55

boost的shared_ptr循环引用的相关文章

shared_ptr循环引用&定置删除器

shared_ptr虽然方便,但是它有着一个致命的缺陷就是循环引用问题,因为shared_ptr本身并没有能力解决这个问题,所以我们又引入了弱指针weak_ptr来辅助shared_ptr解决这个问题. 那么循环引用又是什么场景? 举个栗子: 假设现在我们要创建一个双向整形链表,但是这个链表的指针域全部都用shared_ptr维护: struct Node { int _data; shared_ptr<Node> _next; shared_ptr<Node> _prev; }

智能指针的模拟实现shared_ptr 循环引用 定置删除器

auto_ptr与scoped_ptr的实现见本人的上篇博客. 三.shared_ptr shared_ptr的实现原理是通过引用计数来实现,只有当引用计数为1时才释放空间,否则只需将引用计数减1.拷贝和赋值将引用计数加1,具体代码如下: template <typename T> class SharedPtr { public: SharedPtr(); SharedPtr(T* ptr); SharedPtr(const SharedPtr<T>& ap); ~Sha

深入学习c++--智能指针(二) weak_ptr(打破shared_ptr循环引用)

1. 几种智能指针 1. auto_ptr: c++11中推荐不使用他(放弃) 2. shared_ptr: 每添加一次引用 就+1,减少一次引用,就-1:做到指针进行共享 3. unique_ptr: 一个指针同时只能有一个使用者使用 4. weaked_ptr: 与shared_ptr搭配使用 1.1 weak_ptr 参考:https://zh.cppreference.com/w/cpp/memory/weak_ptr std::weak_ptr 是一种智能指针,它对被 std::sha

shared_ptr造成的循环引用&amp;&amp;解决方法和原理(弱引用&amp;&amp;强引用)

 弱用指针的方式解决shared_ptr造成的循环引用防止内存泄漏! <***>循环引用就是由于智能指针shared_ptr造成的,下面就是shared_ptr的使用造成循环引用的图解: <****>举个例子来说下shared_ptr造成的循环引用: (选题背景双向链表) <span style="font-size:18px;">#include<memory> #include<iostream> using namesp

c++智能指针以及循环引用问题(转)

解决循环引用: 在知道存在循环引用的条件下,使用boost::weak_ptr,即弱引用来代替循环引用中的某个强引用,从而打破循环引用的环. 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete,比如流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执行 delete 的情况并不罕见,并造成内存泄露.如此c++引入 智能指针 . c++ 智能指针主要包括:unique_ptr,shared_ptr, weak_ptr, 这三种,其中auto

[转] weak_ptr解决shared_ptr环状引用所引起的内存泄漏

http://blog.csdn.net/liuzhi1218/article/details/6993135 循环引用: 引用计数是一种便利的内存管理机制,但它有一个很大的缺点,那就是不能管理循环引用的对象.一个简单的例子如下: #include<string> #include <iostream> #include <boost/shared_ptr.hpp> #include <boost/weak_ptr.hpp> class parent; cl

循环引用-智能指针的死穴之一

智能指针的实现思路也体现了C++基于对象的原则,对象应该为自己管理的资源负责,包括资源的分配与释放,而且最好将资源的释放与分配搞的自动化一点,典型的实现方法就是在构造函数里分配资源,在析构函数里释放资源,这样当其他程序员在使用这个对象时,该对象的资源问题几乎不用额外的操心,即优雅又方便 然后如此完美的东西,也有其不容忽视的地方,直接上代码: // share_ptr.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include "c

头文件循环引用的错误

In file included from /usr/include/c++/5/memory:81:0,from Threadpool.h:12,from testThreadpool.cc:7:/usr/include/c++/5/bits/unique_ptr.h: In instantiation of 'void std::default_delete<_Tp>::operator()(_Tp*) const [with _Tp = wd::Thread]':/usr/include

智能指针循环引用--转

在智能指针中shared_ptr用来计算指向对象的指针的个数,但是如果先执行shared_ptr1=shared_ptr2,再执行shared_ptr2=shared_ptr1,这样shared_ptr1.count()和shared_ptr2.count()都为1,这就造成了循环引用,循环引用会导致堆内存无法正确释放,导致内存泄露. 考虑一个简单的对象--家长与子女:a Parent has a Child,a Child Knows his parent.在C++中,如果使用原始指针作为成员