当构造函数引发时,should/could 我调用析构函数?可能在属性上?
When constructor raises, should/could I call destructor ? Possibly on attributes?
我有一个带有构造函数委托的 class DLXMatrix
。它作为一个简单的构造函数:
DLXMatrix::DLXMatrix(int nb_col);
还有一个更高级的目前是:
DLXMatrix::DLXMatrix(int nb_col, const std::vector<std::vector<int>> &rows)
: DLXMatrix(nb_col) {
for (const auto &r : rows) // TODO : cleanup if an exception is raised
add_row_sparse(r);
}
但是,根据输入,对 add_row_sparse(r)
的调用可能会引发 std::out_of_range
异常。
我知道如果我简单地让异常通过,我将在各种属性中泄漏内存(通常属性之一是 vector
)...
请注意,在这个阶段,this
已经指向一个有效的对象,因为根据委托,它是由另一个构造函数构造的。因此,我很想调用析构函数
DLXMatrix::DLXMatrix(int nb_col, const std::vector<std::vector<int>> &rows)
: DLXMatrix(nb_col) {
try {
for (const auto &r : rows)
add_row_sparse(r);
} catch (std::out_of_range e) {
this->~DLXMatrix();
throw std::out_of_range(e);
}
}
不幸的是这个段错误。我完全疯了吗?我应该只在属性上调用析构函数吗?
When constructor raises, should/could I call destructor ?
没有
如果从构造函数中抛出异常,则该对象从未存在过。它不应该也不能被摧毁。
无论是否在构造函数中捕获,都不应在构造函数主体中调用析构函数。
请注意,如果构造函数的一部分已完成而另一部分抛出,则某些 classes 可能确实需要执行清理。在这种情况下,您确实需要捕获异常,然后清理部分完成的构造(不是通过调用 class 的析构函数),然后 re-throw 异常。
我有一个带有构造函数委托的 class DLXMatrix
。它作为一个简单的构造函数:
DLXMatrix::DLXMatrix(int nb_col);
还有一个更高级的目前是:
DLXMatrix::DLXMatrix(int nb_col, const std::vector<std::vector<int>> &rows)
: DLXMatrix(nb_col) {
for (const auto &r : rows) // TODO : cleanup if an exception is raised
add_row_sparse(r);
}
但是,根据输入,对 add_row_sparse(r)
的调用可能会引发 std::out_of_range
异常。
我知道如果我简单地让异常通过,我将在各种属性中泄漏内存(通常属性之一是 vector
)...
请注意,在这个阶段,this
已经指向一个有效的对象,因为根据委托,它是由另一个构造函数构造的。因此,我很想调用析构函数
DLXMatrix::DLXMatrix(int nb_col, const std::vector<std::vector<int>> &rows)
: DLXMatrix(nb_col) {
try {
for (const auto &r : rows)
add_row_sparse(r);
} catch (std::out_of_range e) {
this->~DLXMatrix();
throw std::out_of_range(e);
}
}
不幸的是这个段错误。我完全疯了吗?我应该只在属性上调用析构函数吗?
When constructor raises, should/could I call destructor ?
没有
如果从构造函数中抛出异常,则该对象从未存在过。它不应该也不能被摧毁。
无论是否在构造函数中捕获,都不应在构造函数主体中调用析构函数。
请注意,如果构造函数的一部分已完成而另一部分抛出,则某些 classes 可能确实需要执行清理。在这种情况下,您确实需要捕获异常,然后清理部分完成的构造(不是通过调用 class 的析构函数),然后 re-throw 异常。