条款14:在资源管理类中小心copying行为

本文探讨使用RAII管理资源时,对象被复制的处理方式。包括禁止复制、对底层资源使用引用计数、复制底部资源、转移底部资源拥有权等。指出资源的copying行为决定RAII对象的copying行为,常见的RAII class copying行为有抑制copying和使用引用计数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当你使用RAII来管理资源来的时候,面对对象被复制的时候,会发生什么事情,大多数有如下两种选择:

  • 禁止复制。因为对于“同步化基础器物”(synchronization primitives)的副本,如果复制动作对RAII class并不合理,就该禁止。
  • 对底层资源使用“引用计数”。有时候希望保有资源,直达它的最后一个使用者(某对象)被销毁。这种情况下复制RAII对象时,就该将资源的“被引用计数”递增。tr1::shared_ptr便是如此。
  • 对于上述RAII classes使用引用计数而言,tr1::shared_ptr的缺省行为视“当引用次数为0的时,删除所指物”,那不是我们要的行为,对于mutex而言,想要的是解锁而非删除。幸运的是tr1::shared_ptr允许定制所谓的“删除器”,当引用次数为0的时候便被调用(此技能并不存在于auto_ptr,它总是将其指针删除)。

  • 复制底部资源。有时候,可以针对一份资源拥有其任意数量的复件,当你不再需要的时候确保它被释放。这种情况下你要注意使用的是深拷贝。某些标准字符串类型是”指向heap内存“的指针,当这样的字符串被赋值,不论指针或其所指内存都会被复制一份,这样的字符串应该展现深拷贝行为。
  • 转移底部资源的拥有权。此时资源的拥有权会从被复制物转移到目标物,这时候就该使用auto_ptr。

总结

  • 复制RAII对象必须一并复制它所管理的资源,所以资源的copying行为决定RAII对象的copying行为。
  • 普通而常见的RAII class copying行为是:抑制copying、使用引用计数。不过其他行为也都可能被实现。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值