[C++ 学习笔记 9] Effective C++ 条款 13-17

本文探讨了C++中的资源获取时机就是初始化时机(RAII)概念,讲解了如何利用RAII对象进行资源管理,避免资源泄露。讨论了RAII类的复制行为、提供原始资源访问的方法以及new和delete配对使用的注意事项。

第三章 资源管理

13、以对象管理资源

    获得资源后立刻放进对象(managing object)内。“以对象管理资源”又称“资源取得时机就是初始化时机”(Resource Acquisition Is Initialization; RAII)

    管理对象(managing object)运用析构函数确保资源被释放。

    为防止资源泄漏,请使用 RAII 对象,它们在构造函数中获得资源并在析构函数中释放资源。

    常被使用的 RAII class 是 std::shared_ptr,它是“引用计数器型智能指针”(Reference-counting smart pointer; RCSP),它无法打破环形引用(cycles of reference)。

    不要用智能指针管理动态分配的数组,因为会导致错误形式的释放。参考《[C++ 学习笔记 1] delete 和 delete [] 的本质区别》,https://my.oschina.net/umu618/blog/818839

14、在资源管理类中小心 coping 行为

    复制 RAII 对象必须一并复制它管理的资源,常见的 RAII class copying 行为是:

    (1)禁止复制;

    (2)对底层资源祭出“引用计数法”(reference-count);

    (3)复制底部资源;

    (4)转移底部资源的拥有权。

15、在资源管理类中提供对原始资源的访问

    APIs 往往要求访问原始资源(raw resource),所以每一个 RAII class 应该提供一个“取得其所管理之资源”的方法,比如 .get()。

    对原始资源的访问可能经由显式转换或隐式转换。一般而言,显式转换比较安全,但隐式转换对客户比较方便。

16、成对使用 new 和 delete 时要采取相同形式

    如果你在 new 表达式中使用 [],必须在相应的 delete 表达式中也使用 []。如果你在 new 表达式中不使用 [],一定不要在相应的 delete 表达式中使用 []。参考《[C++ 学习笔记 1] delete 和 delete [] 的本质区别》,https://my.oschina.net/umu618/blog/818839

17、以独立语句将 newed 对象置入智能指针

    以独立语句将 newed 对象存储于(置入)智能指针内。如果不这么做,一旦异常被抛出,有可能导致难以察觉的资源泄漏。

// 编译器可能为了产生更高效代码,而弹性地改变三个元语句的执行顺序
// 如果 priority() 抛出异常,可能导致 new Widget 返回的指针遗失
processWidget(std::shared_ptr<Widget>(new Widget), priority());

// 以下独立语句可行,因为编译器对“跨越语句的各项操作”没有重新排序的自由。
std::shared_ptr<Widget> pw(new Widget);
processWidget(pw, priority());

 

转载于:https://my.oschina.net/umu618/blog/839649

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值