《Effective C++读书笔记》--条款13:以对象管理资源

对于刚接触C++程序员来说,内存泄漏可能是最常遇到的会导致程序崩溃的问题。程序员自己管理内存和资源是一把双刃剑,用的好会使程序效率大大提高,用的不好便会造成一系列诸如内存泄漏,程序崩溃的致命问题。除了最常用的分配内存,还有许多需要管理的资源,包括文件描述器、数据库连接、互斥锁、图形界面中的画笔,网络socket等等。由于异常、函数体内的多个return(在释放资源前程序就退出),程序改动时没充分考虑资源管理等种种原因,使得我们再小心也会出现没有正确释放资源的错误。对此,我们需要以对象来管理资源。

--为了确保资源能正确释放,我们需要将资源放进对象中,当函数退出时,该对象的析构函数会自动释放那些资源。

对于管理资源的对象,我们有智能指针,常用的智能指针有std::auto_ptr,std::tr1::shared_ptr...#TODO,每个指针都有其特点,接下来我们具体分析.

--std::auto_ptr:auto_ptr被销毁时会自动删除其所指的对象,如果多个auto_ptr指向同一个对象,那么对象会被删除多次,从而导致UB,对此,auto_ptr若通过拷贝构造函数或赋值操作符复制他们,那么他们会变成null,复制所得的指针将取得资源的唯一所有权。由于这个原因,STL容易不可以由auto_ptr所管理。

--std::tr1::shared_ptr:由于auto_ptr存在的问题,它并不能很好的管理资源,因此我们引入了引用计数型智能指针,通过计数的方式追踪有多少对象指向某一资源,并且在无人指向时自动删除该资源,由于该特性,tr1::shared_ptr的复制行为就正常很多,因此可被用于STL容器中,但该指针也有一个问题就是无法打破环状引用,比如两个没被使用的对象互指,表现为好像还处在被使用的状态。

以上两者在析构函数内执行的动作都是delete而非delete[],如果对于一个数组,delete仅删除了其中第一者的指针,因此我们不可以在动态分配的array上使用auto_ptr或者shared_ptr。最后,如果一个函数返回一个未加工的指针,我们极容易会忘记在该指针上使用delete,因此我们最好对接口进行修改。


你可能感兴趣的:(Effective,C++读书笔记)