《Effective C++》条款13:以对象管理资源
本章节主要描述了资源释放可能出现的问题;
其中比较着重讲述的是指针资源释放的例子,并且阐述了一个关键点:资源的释放最好交给类来解决,而不是使用delete进行显式的处理;
考虑如下例子:
class test {
public:
test();
};
test* creatTest();
void foo() {
test* tp=creatTest();
//do something;
delete tp;
}
上述代码看起来可能没有什么问题,但是主要集中再delete tp前,不能保证tp肯定被delete;
有可能出现的情况:
1.在delete tp前逻辑流返回,没有执行;
2.有可能出现异常,没有执行;
真对于上述问题,如果依赖显式的delete,往往会出现内存泄露的问题;
所以,该章节给出了一个新的思路:依赖于资源管理类,使得资源管理类的析构函数负责该块区域的delete;
其中比较典型的做法就是依赖于智能指针,auto_ptr以及share_ptr指针;
两者应用的场景也不尽相同:
auto_ptr指针只能一个指针指向一个,使用赋值或者符号赋值,只有被赋值的指针用于该资源的唯一控制权;
share_ptr指针则采用引用计数,可以多个指针指向同一资源;
auto_ptr:
auto_ptr指向唯一的对象,并且本身就是一个类,可以保证auto_ptr销毁采用析构函数的时候,对指针指向资源进行释放;
所以如果在上述例子中使用auto_ptr,可以不用操心使用delete显式释放资源;
但是还是需要注意的一点是auto_ptr赋值以及赋值符号并不能使得多个指针共享一个资源;
所以会使得auto_ptr在容器内复制中产生问题;
如下所示:如果采用copy赋值会导致只有被赋值的指针具有操作权:
std::auto_ptr<test> Tv1(creatTest());
std::auto_ptr<test> Tv2(Tv1); Tv1 = Tv2;
share_ptr:
auto_ptr存在的问题是不能使得多个指针指向同一个对象,采用引用计数的方式;
boost库中也有相关的问题,所以可以作为参考;
注意:
share_ptr和auto_ptr都只针对于单个元素,而不能能对数组类型的元素进行释放,尽管编译器不会做出任何反应;
但是拥有STL也不需要对数组元素进行指向或者释放,直接利用string和vector进行可变数组的维护即可;

浙公网安备 33010602011771号