专栏首页C++核心准则原文翻译C++核心准则E.13: 直接拥有一个对象所有权时永远不要抛出异常

C++核心准则E.13: 直接拥有一个对象所有权时永远不要抛出异常

E.13: Never throw while being the direct owner of an object

E.13: 直接拥有一个对象所有权时永远不要抛出异常

Reason(原因)

That would be a leak.

那样做会发生泄露。

Example(示例)

void leak(int x)   // don't: may leak
{
    auto p = new int{7};
    if (x < 0) throw Get_me_out_of_here{};  // may leak *p
    // ...
    delete p;   // we may never get here
}

One way of avoiding such problems is to use resource handles consistently:

避免这种问题的一种方法是始终如一地使用资源句柄。

void no_leak(int x)
{
    auto p = make_unique<int>(7);
    if (x < 0) throw Get_me_out_of_here{};  // will delete *p if necessary
    // ...
    // no need for delete p
}

Another solution (often better) would be to use a local variable to eliminate explicit use of pointers:

另外一个解决方案(通常更好)是用局部变量来避免使用指针。

void no_leak_simplified(int x)
{
    vector<int> v(7);
    // ...
}

Note(注意)

If you have local "things" that requires cleanup, but is not represented by an object with a destructor, such cleanup must also be done before a throw. Sometimes, finally() can make such unsystematic cleanup a bit more manageable.

如果局部的“某物”需要清除,但却没有实现为一个具有析构函数的对象,这些清理操作也必须在抛出异常之前进行。有时,finally函数可以让这种非系统化的清理动作稍微容易管理一些。

原文链接https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#e13-never-throw-while-being-the-direct-owner-of-an-object

本文分享自微信公众号 - 面向对象思考(OOThinkingDalian),作者:面向对象思考

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-07-31

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C++核心准则ES.24: 使用unique_ptr<T>管理指针

    Using std::unique_ptr is the simplest way to avoid leaks. It is reliable, it mak...

    面向对象思考
  • C++核心准则ES.26: 不要将一个变量用于两个无关的用途

    As an optimization, you may want to reuse a buffer as a scratch pad, but even th...

    面向对象思考
  • C++核心准则C.133:避免保护型数据成员‍

    protected data is a source of complexity and errors.protected data complicates t...

    面向对象思考
  • java基础|java中的二进制运算以使用场景

    二进制就是只有0和1这两个数.这和我们现实很多场景都类似, 如男/女,是/否,是否已读等.那么对一个主体的描述, 我们可以有一个二进制串来标识一系列的flag.

    微笑的小小刀
  • 使用三拼域名的人人车 获滴滴战略投资2亿美元

    09月26日,国内二手车电商人人车今日宣布完成新一轮2亿美元融资,以支持其规模化战略的快速推进。本轮战略投资方是全球领先的出行平台滴滴出行,双方还将...

    躲在树上的域小名
  • ASP.NET MVC5 实现分页查询

    对于大量数据的查询和展示使用分页是一种不错的选择,这篇文章简要介绍下自己实现分页查询的思路。

    雪飞鸿
  • 04-树5. File Transfer--并查集

      对于一个集合常见的操作有:判断一个元素是否属于一个集合;合并两个集合等等。而并查集是处理一些不相交集合(Disjoint Sets)的合并及查询问题的有利工...

    llhthinker
  • 【leetcode刷题】20T46-子集 II

    https://leetcode-cn.com/problems/subsets-ii

    木又AI帮
  • 背包问题

    问题描述 假设你是一个贪婪的小偷,背着可以装35磅重东西的背包,在商场伺机偷窃各种可以装入背包的商品。 ? 你力图往背包中装入价值最高的商品,你会用哪种算法呢?...

    我没有三颗心脏
  • 【每日一练】第001期--两数之和

    给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

    会呼吸的Coder

扫码关注云+社区

领取腾讯云代金券