1

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

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

我怎样才能调用这个对象的析构函数?

4

5 回答 5

9

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

于 2012-07-26T10:33:49.143 回答
7

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

清晰、明显、最安全且可能最有效的解决方案是只使用正常的C++ 语义。“重新初始化”是通过赋值完成的。

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

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

哦,假设一个没有错误的库,在所有这些情况下内存泄漏为零。只是不要折腾new,不要玩火(比如直接调用析构函数)。

于 2012-07-26T10:38:17.737 回答
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
}
于 2012-07-26T10:35:31.197 回答
2

我知道只有一种情况需要显式调用析构函数:使用placement new时,例如

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

char foo[sizeof(Foo)];
new (&foo[0]) Foo();
/* ... */
reinterpret_cast<Foo *>(&foo[0])->~Foo();
于 2012-07-26T11:11:54.493 回答
0

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

M.~SparseMatrix();

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

于 2012-07-26T10:49:54.537 回答