boost之智能指针

内存问题永远是c++中讨论的重要话题

1.c98 auto_ptr的实现,auto_ptr的特点是始终只保持一个指针指向对象,若经过赋值或者拷贝之后原指针失效

#include <iostream>

using namespace std;

template<typename T>
class auto_ptr
{
public:
	explicit auto_ptr(T* px = 0):m_px(px){}
	auto_ptr(const auto_ptr& rhs):m_px(rhs.release())
	{

	}
	auto_ptr& operator=(auto_ptr& rhs)
	{
		reset(rhs.release());
		return *this;
	}
	T* get()
	{
		return m_px;
	}
	T& operator*()
	{
		return *m_px;
	}
	T* operator->()
	{
		return m_px;
	}
	T* release()
	{
		T* temp = m_px;
		m_px = 0;
		return temp;
	}
	T* reset(T* px)
	{
		delete m_px;
		m_px = ptr;
	}
     ~ auto_ptr(){delete m_px;} private: T *m_px; }; int main() { return 0; }

2.boost库里的scoped_ptr和auto_ptr实现方式相同,不同点是scoped_ptr禁止赋值和拷贝。相同的缺点是可以返回原始指针,但是会让对象脱离智能指针的控制。、

scoped_ptr和auto_ptr都不能用作容器,原因不一样,auto_ptr转移语义,scoped_ptr则禁止复制。

 3.shared_ptr是boost里最重要的指针,实现比auto_ptr要复杂的多,采用了引用计数和成员函数模板

下面说说shared_ptr存在的问题,

3.1.这个问题也是多线程存在的问题,线程安全,会进行重复析构。

#include <iostream>
#include <boost/shared_ptr.hpp>
using namespace std;
using namespace boost;

int main()
{
	string *pstr = new string("test program");
	{
		shared_ptr<string> sp1(pstr);
		cout << sp1->size() <<endl;
	}
	shared_ptr<string> sp2(pstr);
	cout << sp2->size() <<endl;
	return 0;
	
}

3.2循环引用,循环引用会造成内存泄漏,解决办法是将这种强引用关系转为弱引用关系,其中的一个成员变量使用weak_ptr<Parent> m_parent;

#include <iostream>
#include <boost/shared_ptr.hpp>
using namespace std;
using namespace boost;
class Parent;
class Children;
typedef boost::shared_ptr<Parent> parent_ptr;
typedef boost::shared_ptr<Children> children_ptr;


class Parent
{
public:
	children_ptr m_children;
};

class Children
{
public:
	parent_ptr m_parent;
};


int main()
{
	parent_ptr parent(new Parent);
	children_ptr children(new Children);
	parent->m_children = children;
	children->m_parent = parent;
	
	return 0;
	
}
原文地址:https://www.cnblogs.com/liuweilinlin/p/3259473.html