如何调用模板类的析构函数?

时间:2012-07-26 10:30:49

标签: c++ class destructor eigen

我正在使用库Eigen的SparseMatrix类。要创建一个,我使用:

typedef Eigen::SparseMatrix<float>  matrix;
matrix M (10,10);

如何调用此对象的析构函数?

5 个答案:

答案 0 :(得分:9)

你不需要。您的对象正在堆栈上创建,并在超出范围时自动删除。

答案 1 :(得分:7)

  

(...)因为我需要在循环中多次重新初始化相同的稀疏矩阵。我希望每次通过析构函数破坏矩阵都会导致最小的内存泄漏。

明确,明显,最安全且可能最有效的解决方案是仅使用普通 C ++语义。 “重新初始化”是通过分配完成的。

typedef Eigen::SparseMatrix<float>  matrix;
matrix M (10,10);
M = matrix(12, 12);

在循环体内声明矩阵,它将在每次循环迭代时正确初始化和销毁​​。

哦,假设一个非错误的库,在所有这些情况下都有内存泄漏。只是不要抛弃new并且不要玩火(就像直接调用析构函数一样)。

答案 2 :(得分:2)

你不直接调用析构函数;当这个变量超出范围时,它将被调用。

void myFunction()
{
    matrix A (10,10);
    ... some code
    {
        matrix B (10,10);
    } // destructor of B is called here.
    ... some code
}// destructor of A is called here.

这是您的代码中的自动变量的行为。调用析构函数的另一种方法是,如果您使用new动态分配了对象,并使用delete销毁该对象:

void myFunction()
{
    matrix* A = new matrix(10,10);
    ... some code
    {
        matrix* B = new matrix(10,10);
        delete B;// destructor of B is called
    }
    ... some code
    delete A;// destructor of A is called
}

答案 3 :(得分:2)

我只知道你需要明确调用析构函数的一个案例:使用placement new时,例如

class Foo { /* lots of stuff here */ };

char foo[sizeof(Foo)];
new (&foo[0]) Foo();
/* ... */
reinterpret_cast<Foo *>(&foo[0])->~Foo();

答案 4 :(得分:0)

虽然我真的不确定你为什么要这样做,但这很容易:

M.~SparseMatrix();

通常,您可以在任何类上显式调用析构函数,只需调用它就像任何其他函数一样。模板化的课程也不例外。