Effective C++ - 条款14 - 在资源管理类中小心copying行为

  • 问题:当拷贝一个RAII对象时会发生什么?有以下几种选择
  1. 禁止复制
    如果复制一个RAII是不合理的,把拷贝构造和拷贝赋值运算符定义为delete就行了。
  2. 引用计数
    某些资源的RAII对象可以被复制,但是当最后一个RAII对象不再使用时,应该销毁资源。书中用tr1::shared_ptr举例,这个东西应该是c++98/03的东西,后来被假加入到c++11标准中了。c++11的智能指针就包括引用计数。
    但是在某些语义中,引用计数为0时并不是希望删除其所指对象资源,而是做一些其他操作,这时就需要自定义删除器,参考premier c++吧,我记得其中有讲到
  3. deep copying
    复制RAII对象时,也把所指向的资源对象拷贝一份,就是所谓的深拷贝 deep copying。比如某些字符串类,使用一个指针来指向一块heap,那么在复制这个字符串类对象(即RAII对象)时,要把指针和heap内存都复制一份。
  4. 转移资源
    希望资源对象只被一个RAII管理,那么就在拷贝RAII时把资源的所有权转移过去。老式的auto_ptr就是这样的,回想到条款13, 复制auto_ptr时,旧的auto_ptr会被赋值为null
posted @ 2022-11-06 10:00  ijpq  阅读(12)  评论(0编辑  收藏  举报