条款13:以对象管理资源

什么是资源?内存?没错但是内存只是我们需要管理众多资源的一种,资源还包括数据的连接,文件描述符,互斥锁,网络套接字,不管哪种资源他都是从系统中获取的,当你不在需要他的时候是要还给系统的。

现有个一个投资类型的基类。

class Investment // 投资类型的基类
{ };

Investment* createInvestment() {}; // 工厂函数返回一个在heap上开辟的对象

void fun()
{
	Investment* pI = createInvestment();
	// .....
	//......
	delete pI;
}

fun 函数最后一行已经将工厂函数返回的指针给delete,看似没什么问题,那我问你,如果在 ... 之中提前return 那么他还会不会删除? 如果你的delete语句在循环中,遇到goto 和 break之后你的pI还能不能被释放?

即使你是一个非常细心的程序员,那么这段代码开始维护了呢?,有些人胡乱添加一个return break,goto而不考虑资源释放。

所以可以将资源放到对象当中,对象生命周期结束调用析构函数来释放资源。

这就是智能指针

void fun()
{
	 std::auto_ptr  pI (createInvestment());
	// .....
	//......
}

当然现在auto_ptr已经被淘汰了,C++11之后 unique_ptr完全代替了auto_ptr,unique_ptr 不仅支持指向数组,还支持自定义删除器都是auto_ptr不具备的,而且 c++17之后auto_ptr被完全删除。

RAII的核心思想

获取资源之后立马放到对象中管理。

运用析构函数确保资源被释放。

因为C++11之后引入的unique_ptr, shared_ptr和weak_ptr,解决了本条款的很多问题,有需要去了解unique_ptr, shared_ptr和weak_ptr即可。

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