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);

ループ本体内で行列を宣言すると、ループの反復ごとに適切に初期化され、破棄されます。

ああ、バグのないライブラリを想定すると、これらすべてのケースでメモリリークはゼロです。sを投げ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.

これは、コードにある自動変数の動作です。デストラクタを呼び出すもう 1 つの方法は、 でオブジェクトを動的に割り当て、 でオブジェクト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

デストラクタを明示的に呼び出す必要があると私が知っているケースは 1 つだけです。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 に答える