条款- 13 以对象管理资源
Remember:
1- 为防止资源泄露,请使用 RAII(资源获取初始化) 对象,它们在构造函数中获得资源并在析构函数中释放资源。
2- 两个常被使用的 RAII class 分别是 tr1::shared_ptr 和 auto_ptr。前者通常是较佳选择,因为其 copy 行为比较直观。若选择 auto_ptr,复制动作会使它(被复制物)指向 null。
所谓 资源 就是,一旦使用了它,将来就必须还给系统。C++ 最长用的就是动态分配内存,如果不释放的话,就会造成内存泄露。
本条款针对的是所分配的 class 对象。
常规做法:在使用完对象后就delete其对象。当代码数量较多的时候一般用函数进行封装。
但是这样会遇到一个问题:有时候还没来得及删除时,就遇到一个 return。这样就导致了内存泄露。
解决方法:C++ 的“析构函数自动调用机制”。
两种常用的只能指针: auto_ptr、tr1::shared_ptr。
当正常地使用 析构函数自动删除的时候两个智能指针形式差不多。但是当使用复制行为进行赋null的时候,tr1::shared_ptr明显看着更舒服。
【注】auto_ptr 和 tr1::shared_ptr 都是在析构函数内做 delete 而不是 deletep[]。那意味着在动态分配而得的 array 身上使用 auto_ptr或 shared_ptr是个馊主意。其实定义vector、string就可以代替array了。