利用’对象的析构函数一定会被调用’这一特性,在对象析构的时候delete资源。对于的机制是智能指针。目的是帮助自动释放资源。
常用的智能指针:STL的std::auto_ptr<>、TR1的std::tr1::shared_ptr<>
std::auto_ptr<>
auto_ptr<>在被销毁的时候(离开其scope时),将会==对其所指向对象调用delete==。
1. 不要令多个auto_ptr<>指向同一个对象,否则该对象会被delete多次;一个对象被delete多次将会导致未定义的结果甚至是致命错误;
2. auto_ptr<>不会保留副本:当拷贝一个auto_ptr<>的时候,被拷贝的那个auto_ptr<>会变成nullptr;
3. auto_ptr<>不是引用计数型的,只要它到达生命期,指向的对象就被delete;
std:: tr1::shared_ptr<>
- shared_ptr<>是引用计数型的,ref_cnt == 0时才delete对象
- shared_ptr<>的拷贝是正常的拷贝,允许保留副本
智能指针未完善的地方
- 以上两个智能指针只能指向delete而不能执行delete [];因此==**绝对不要使用auto/shared_ptr来指向动态数组(也没有必要使用动态数组,因为vector和string完全ok);
- 针对数组的替代品:boost::scoped_array、boost::shared_array;
std::tr1::shared_ptr<>有一个重载形式:第二个参数可以接收删除器deleter
当引用计数为0时,shared_ptr不delete对象,而是执行删除器deleter。
因此,可以在deleter中定制自己的管理操作。