《Effective C++》条款13

以对象管理资源

有这样一段代码:

class A
{
public:
	A* create()
	{
		...
	}
	
};
class B :public A
{
public:
	A* ptr = create();
	...
	delete ptr;
};

我们定义了ptr去接收create()函数的返回值,并且在最后进行了回收资源。看似是没问题的。但是实际上有很多隐患:

1.delete前的...或许有一个过早的return语句

2.delete语句位于某个循环内,也许会进行过早的goto或者break

3.delete前的...或许有一个异常抛出

所以这样写并不是最佳的。

那如何写呢? 

引入C++11的智能指针

class B :public A
{
public:
	auto_ptr ptr(create());
	...
	
};

不论控制流如何离开区块,一旦对象被销毁其析构函数自然会被自动调用,于是资源被释放

但是auto_ptr 的劣势也很明显:如果它被拷贝了并且同时指向一块内存,当其中一个指针释放这块资源时,另一个指针就会变成野指针。 

怎么办?

利用其他的智能指针

shared_ptr :

利用计数的思想,当多个指针同时管理一块资源时,每释放一个指针,计数减一,直到0便释放资源。避免了野指针的问题。

unique_ptr:

不允许拷贝,更杜绝了以上问题。

weak_ptr:

针对unique_ptr的缺陷(循环引用)进行填补.

所以:

1.为了防止资源泄漏,请使用RAII对象

2.尽量少使用auto_ptr 

你可能感兴趣的:(c++,开发语言)