Effective C++ - 条款14 - 在资源管理类中小心copying行为
- 问题:当拷贝一个RAII对象时会发生什么?有以下几种选择
- 禁止复制
如果复制一个RAII是不合理的,把拷贝构造和拷贝赋值运算符定义为delete就行了。 - 引用计数
某些资源的RAII对象可以被复制,但是当最后一个RAII对象不再使用时,应该销毁资源。书中用tr1::shared_ptr
举例,这个东西应该是c++98/03的东西,后来被假加入到c++11标准中了。c++11的智能指针就包括引用计数。
但是在某些语义中,引用计数为0时并不是希望删除其所指对象资源,而是做一些其他操作,这时就需要自定义删除器,参考premier c++吧,我记得其中有讲到 - deep copying
复制RAII对象时,也把所指向的资源对象拷贝一份,就是所谓的深拷贝 deep copying。比如某些字符串类,使用一个指针来指向一块heap,那么在复制这个字符串类对象(即RAII对象)时,要把指针和heap内存都复制一份。 - 转移资源
希望资源对象只被一个RAII管理,那么就在拷贝RAII时把资源的所有权转移过去。老式的auto_ptr就是这样的,回想到条款13, 复制auto_ptr时,旧的auto_ptr会被赋值为null
本文来自博客园,作者:ijpq,转载请注明原文链接:https://www.cnblogs.com/ijpq/p/16861979.html