【问题标题】:C++ constructor: which exception type should I throw when malloc fails to allocate memoryC++ 构造函数:当 malloc 分配内存失败时我应该抛出哪种异常类型
【发布时间】:2021-09-18 05:50:29
【问题描述】:

所以,想象一下我有这个代码:

typedef struct Point {
    float x;
    float y;
} Point;

class Foo {
    private:
        Point * p;
    public:
        Foo () {
            this->p = (Point *) malloc(sizeof(Point));
            if (this->p == NULL) {
                // throw exception_malloc_fail;
            }
        }
};

一旦 malloc 在构造函数中分配内存失败,我应该抛出哪种异常?

在这种情况下,我不能简单地返回falseNULL。所以throw 声明应该是要走的路。

但是,我找不到要抛出的正确类型的异常。我应该抛出一个默认异常吗?或者有适合这种情况的吗?

【问题讨论】:

  • 你有理由使用malloc而不是new,它会自动抛出吗? malloc 不会调用构造函数,通常用于不支持构造函数的不同语言中。
  • typedef struct Point 让我觉得这是来自 C 的人,而 malloc 只是被标记了。
  • 更好的是,完全避免分配并使用Point p而不是指针。
  • “在我看来,它消耗的内存更少,使用 malloc 更快” @CarlHR 你的眼睛会欺骗你。 new 不会比 malloc 花费更多(事实上,new 通常是用 malloc 编写的)。然而new 实际上是 C++ 语言 的一部分,并开始一个新对象的生命周期; malloc 不是,如果您有一个微不足道的对象,则会导致未定义的行为。这不是个人喜好问题。这是一个非常重要的对与错问题。如果您不熟悉它,我强烈建议您熟悉它

标签: c++ error-handling constructor malloc throw


【解决方案1】:

最合适的例外是抛出std::bad_alloc;但是强烈建议不要使用malloc,除非你有充分的理由——所以我建议不要明确地抛出这个。

如果你绝对需要堆内存,你应该使用new/delete——它会自动调用构造函数/析构函数,开始/结束对象生命周期,并会抛出一个@987654330 @当你的内存不足时。 std::malloc 将导致任何非平凡类型的未定义行为,因为它不会正式启动对象的生命周期。

更好的是, 已经存在超过 十年,所以请使用 std::unique_ptr,如果您有 ,请使用 std::make_unique,这样您甚至都不会需要直接newunique_ptr 将通过确保在分配的指针不为空时调用 delete 来防止内存泄漏。

现在看起来像:

#include <memory>

// Note: 'typedef struct' does nothing in C++ -- there is no need for it
struct Point {
    float x;
    float y;
};

class Foo {
    private:
        std::unique_ptr<Point> p;
    public:
        Foo () 
          : p{std::make_unique<Point>()}
        {

        }
};

除了上面的答案:你不应该真正使用堆内存,除非你真的需要具有动态生命周期的对象。在您提供的代码中,似乎只保留 Point 的值可能更合适:

class Foo {
    private:
        Point p;
    public:
        Foo () 
          : p{} // no allocation needed
        {

        }
};

【讨论】:

    猜你喜欢
    • 2019-08-12
    • 1970-01-01
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    • 2014-04-03
    相关资源
    最近更新 更多