什么是资源?内存?没错但是内存只是我们需要管理众多资源的一种,资源还包括数据的连接,文件描述符,互斥锁,网络套接字,不管哪种资源他都是从系统中获取的,当你不在需要他的时候是要还给系统的。
现有个一个投资类型的基类。
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<Investment> 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即可。