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 在构造函数中分配内存失败,我应该抛出哪种异常?
在这种情况下,我不能简单地returnfalse
或NULL
。所以 throw
语句应该是正确的方法。
但是,我找不到要抛出的正确异常类型。我应该只抛出一个默认异常吗?或者有没有适合这种情况的?
最合适的异常是抛出 std::bad_alloc
;但是强烈建议不要使用 malloc
除非你有充分的理由 - 所以我建议不要明确抛出它。
如果你绝对需要堆内存,你应该使用new
/delete
——它会自动调用constructors/destructors,start/end 对象的生命周期,当内存不足时会抛出一个 std::bad_alloc
。 std::malloc
将导致任何非平凡类型的未定义行为,因为它没有正式开始对象的生命周期。
更好的是,c++11 has been out for over ten years, so use std::unique_ptr
and, if you have c++14, 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
{
}
};
所以,假设我有这个代码:
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 在构造函数中分配内存失败,我应该抛出哪种异常?
在这种情况下,我不能简单地returnfalse
或NULL
。所以 throw
语句应该是正确的方法。
但是,我找不到要抛出的正确异常类型。我应该只抛出一个默认异常吗?或者有没有适合这种情况的?
最合适的异常是抛出 std::bad_alloc
;但是强烈建议不要使用 malloc
除非你有充分的理由 - 所以我建议不要明确抛出它。
如果你绝对需要堆内存,你应该使用new
/delete
——它会自动调用constructors/destructors,start/end 对象的生命周期,当内存不足时会抛出一个 std::bad_alloc
。 std::malloc
将导致任何非平凡类型的未定义行为,因为它没有正式开始对象的生命周期。
更好的是,c++11 has been out for over ten years, so use std::unique_ptr
and, if you have c++14, 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
{
}
};