当构造函数引发时,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 异常。