【问题标题】:Malloc in C++ constructorC++ 构造函数中的 Malloc
【发布时间】:2011-04-23 10:38:21
【问题描述】:

我必须与来自 C++ 类构造函数(英特尔库)的一些 C 代码交互


  class A{
    A{
     x = ippiMalloc();
     if(x==NULL) ...
    }
  }

在构造函数中使用了 malloc 函数(intel 版本)。如果 ippiMalloc 函数不成功,那么正确的处理方法是什么。抛出异常?

【问题讨论】:

  • Ippi(集成性能基元)
  • 警告如果您不熟悉此操作:如果有第三方智能指针可用于您想要的所有权语义,可能是shared_ptr,然后使用它来代替原始指针。否则,A 应该是一个专门用于管理x 的分配和释放的类。这不仅仅是空想的“关注点分离是一种很好的做法”:编写一个负责管理多个资源的异常安全类非常尴尬,即使只有一个资源也有点繁琐......
  • ...所以未能分离关注点不仅会导致设计欠佳,而且很可能会导致您现在编写损坏的代码。

标签: c++ c exception constructor


【解决方案1】:

是的,异常可能是这里处理错误的最合适方式——至少它是最干净的方式。这也是“新”运算符在失败时会执行的操作。

如果您的应用没有异常感知能力,那么您就有问题了。在这种情况下,类上的工厂方法可能有意义。

static A * create() { ... }

在这里您可以将其包装到一个非异常程序中,如果您无法创建该对象,可能会返回 null。

【讨论】:

  • 再一次,如果你的应用不知道返回空值,你只是引入了问题而不是删除它们。
  • 如果您的应用程序没有异常意识,它/必须/检查返回值。您真的没有其他选择:异常和/或返回值。
【解决方案2】:

首先,在构造函数中添加括号:) 是的,我会投票支持抛出异常,因为替代方案不是很令人愉快,比如在类中设置一些 bool,比如 object_state_is_not valid 或其他东西。

【讨论】:

    【解决方案3】:

    加入前面的答案 - 和 here 很好地解释了为什么异常是构造函数中错误处理的最佳方式。 (C++ FAQ Lite)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-12
      • 1970-01-01
      • 2017-01-04
      • 2018-11-05
      • 1970-01-01
      • 2010-11-10
      • 1970-01-01
      • 2016-09-09
      相关资源
      最近更新 更多