Effective C++读书笔记——item14(小心管理类中的复制行为)

  1. 资源管理类的概念背景

    • 资源是程序中需要获取和释放的东西,比如动态分配的内存(通过new)、文件描述符、互斥锁等。C++ 中,为了确保资源能够被正确地获取和释放,常常会使用资源管理类来封装这些资源。例如std::auto_ptr(在 C++11 中已经被弃用,但在早期是一个典型的资源管理类),它用于管理动态分配的内存,当auto_ptr对象被销毁时,其析构函数会自动释放它所管理的内存。
    • 资源管理类通过获取资源的初始化(例如在构造函数中获取资源)和释放资源的析构函数(例如在析构函数中释放文件描述符)来保证资源的生命周期管理。
  2. 复制资源管理类对象带来的问题

    当一个资源管理类对象被复制时,会出现多种可能的情况。如果简单地进行浅复制(默认的复制构造函数和赋值运算符所做的工作),可能会导致多个对象管理同一份资源。例如,假设有一个简单的文件资源管理类FilePtr,如果只是简单地复制FilePtr对象,那么两个对象可能会指向同一个打开的文件。当其中一个对象的析构函数被调用并关闭文件时,另一个对象再尝试对文件进行操作就会出错。
    • 有几种常见的处理复制行为的策略:
    • 禁止复制:可以将复制构造函数和赋值运算符声明为private并且不实现它们(或者实现为delete,这是 C++11 的新特性)。这样,当用户代码试图复制该资源管理类的对象时,编译器会报错。这种策略适用于那些资源不应该被共享的情况,比如一个独占锁的管理类。
    • 引用计数法:在资源管理类中使用引用计数来记录有多少个对象在共享这份资源。当复制一个对象时,增加引用计数;当一个对象被销毁时,减少引用计数。当引用计数为 0 时,释放资源。std::shared_ptr就是采用这种方式来管理资源的。
    • 复制:在复制资源管理类对象时,创建一个新的资源副本。例如,对于一个管理动态分配数组的资源管理类,复制操作可以分配新的内存,然后将原数组的内容复制到新数组中。这种方式确保每个对象都有自己独立的资源,但可能会有性能开销,特别是当资源比较大的时候。
    • 总结    在设计资源管理类时,需要仔细考虑复制操作的语义。要根据资源的性质(是否可以共享、复制成本等)来选择合适的复制策略,以避免资源泄漏、错误的资源释放等问题,确保资源管理的正确性和安全性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值