为shared_ptr中对象增加安全的强有力技术

2014年4月16日 由 Creater 留言 »

shared_ptr<>是在堆中对象的wraper。有时候,由于历史原因或者库接口原因,不支持智能指针参数,我们需要从shard_ptr中提取出原始指针,但是原始指针就会增加不安全因素,因为说不定就在某个函数内被delete,然而其他地方仍旧使用该内存区,导致内存泄露。

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

class A
{
private:
	class deleter
	{
	public:
		void operator()(A* p)
		{
			std::cout<<"delete A"<<std::endl;
			delete p;
		}
	};
public:
	static boost::shared_ptr<A> creatA()
	{
		boost::shared_ptr<A> p1(new A(),A::deleter());
		return p1;
	}
protected:
	 virtual ~A(){std::cout<<"析构 A"<<std::endl;}
};

int _tmain(int argc, _TCHAR* argv[])
{
	{
		boost::shared_ptr<A> p = A::creatA();
#if 0
		A* a = p.get();
		delete a;
#endif 
#if 0
		A* a = new A();
		delete a;
#endif
	}
	system("pause");;
	return 0;
}

在上面中,让析构函数为保护(protected)权限,这样可以有效避免直接析构原始指针。为了能够有效清理对象,需要定义一个删除器仿函数,如代码中的deleter.

		A* a = p.get();
		delete a;

当使用智能指针获取原始指针并delete时,将会出错。

		A* a = new A();
		delete a;

甚至,你不能在栈上定义A的对象,更不能delete A的原始指针。

这当然对shared_ptr使用来说,更安全。但是意味着使用也更受限。

广告位

评论已关闭.