Effective C++第三版之(三)Resource Management

Resource Management资源管理

1,C++程序最常使用的资源便是动态内存分配,其他常见资源包括文件描述符、互斥锁、图形界面的字型和笔刷、数据库连接、网络socket,不论哪种资源,不再使用时都需要还给系统。
2,资源管理的好办法是基于对象管理,建立在C++构造函数、析构函数、copying函数上,严守以下方法几乎可消除资源管理问题。

条款13:Use objects to manage resources.以对象管理资源
1,控制流中资源使用完成后释放资源,但当控制流语句抛出异常或其他原因来不及调用释放语句时,造成资源泄漏,谨慎的编写程序可防止此类错误,但多人共同开发代码或后期维护会造成与本意相违的执行,或是异常抛出,因此单纯依赖控制流一定会执行释放语句不可靠。
2,为确保资源一定会被释放,将资源放进对象内,控制流离开对象作用域时对象析构函数自动释放资源,依赖C++析构函数自动调用机制确保资源释放。
3,标准库提供智能指针管理动态对象,自动释放所指向的对象。

条款14:Think carefully about copying behavior in resource-managing classes.在资源管理类中小心copying行为
1,条款13中资源获得时机便是初始化时机(RAII),当建立自己的资源管理类时,需要注意RAII对象复制问题,一般是禁止复制或底层资源引用计数。
1)标准库提供的智能指针便是使用底层引用计数,当引用计数为0时删除所指对象。
2)假设智能指针管理对象为互斥锁,当锁的引用计数为0时需要解除锁定而不是删除,此时可指定智能指针的删除器为解锁操作。
2,复制底层资源时需要深度拷贝,或者转移底部资源的拥有权。
1)copying函数除非编绎器合成版本与预期行为一致否则需要自行定义。
2)资源的copying行为决定了RAII对象的copying行为,常见的RAII class copying行为是:抑制copying、引用计数。

条款15:Provide access to raw resources in resource-managing classes.在资源管理类中提供原始资源的访问。
1,标准库智能指针提供get成员函数,返回智能指针内部的原始指针。
2,自定义资源管理类可提供隐式类型转换operator type() const。此类型转换运算符是隐式执行的,为避免隐式转换带来问题,C++11引入显式类型转换运算符,与显式构造函数一样,使用explicit关键字定义显式的类型转换,使用static_cast显式请求强制转换。

条款16:Use the same form in corresponding uses of new and delete.成对使用new和delete时要采取相同形式
1,当使用new时分配内存并调用构造函数,当使用delete时调用析构函数并释放内存。
2,如果new时使用了[],delete时也必须使用[],如果调用时没有使用[],delete时不可使用[]。

条款17:Store newed objects in smart pointers in standalone statements.以独立语句将newed对象置入智能指针
1,若资源创建及资源管理与其他操作在同一语句,编绎器可任意决定其他操作与资源创建管理的执行次序,在资源创建及转换资源为管理对象之间发生异常,则会导致创建的资源未被管理而导致泄漏,资源创建与资源管理需独立于其他操作。
2,编绎器对跨越语句的操作不得任意决定执行次序,所以需要以独立语句将new出的对象存储于智能指针中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值