C++构造函数:当malloc分配内存失败时我应该抛出哪种异常类型

C++ constructor: which exception type should I throw when malloc fails to allocate memory

所以,假设我有这个代码:

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 在构造函数中分配内存失败,我应该抛出哪种异常?

在这种情况下,我不能简单地returnfalseNULL。所以 throw 语句应该是正确的方法。

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

最合适的异常是抛出 std::bad_alloc;但是强烈建议不要使用 malloc 除非你有充分的理由 - 所以我建议不要明确抛出它。

如果你绝对需要堆内存,你应该使用new/delete——它会自动调用constructors/destructors,start/end 对象的生命周期,当内存不足时会抛出一个 std::bad_allocstd::malloc 将导致任何非平凡类型的未定义行为,因为它没有正式开始对象的生命周期。

更好的是, has been out for over ten years, so use std::unique_ptr and, if you have , use std::make_unique 所以您甚至 不需要 new 直接。 unique_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
        {

        }
};