ライブラリEigenの SparseMatrix クラスを使用しています。作成するには、次を使用します。
typedef Eigen::SparseMatrix<float> matrix;
matrix M (10,10);
このオブジェクトのデストラクタを呼び出すにはどうすればよいですか?
ライブラリEigenの SparseMatrix クラスを使用しています。作成するには、次を使用します。
typedef Eigen::SparseMatrix<float> matrix;
matrix M (10,10);
このオブジェクトのデストラクタを呼び出すにはどうすればよいですか?
その必要はありません。オブジェクトはスタック上に作成されており、スコープ外になると自動的に削除されます。
(...) ループ内で同じ疎行列を数回再初期化する必要があるためです。デストラクタによって毎回マトリックスを破棄すると、メモリリークが最小限に抑えられることを願っています。
明確で、明白で、最も安全で、おそらく最も効率的な解決策は、通常のC++ セマンティクスを使用することです。「再初期化」は代入で行います。
typedef Eigen::SparseMatrix<float> matrix;
matrix M (10,10);
M = matrix(12, 12);
ループ本体内で行列を宣言すると、ループの反復ごとに適切に初期化され、破棄されます。
ああ、バグのないライブラリを想定すると、これらすべてのケースでメモリリークはゼロです。sを投げnew
たり、火遊びをしたりしないでください (デストラクタを直接呼び出すなど)。
デストラクタを直接呼び出すことはありません。この変数がスコープ外になると呼び出されます。
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
}
デストラクタを明示的に呼び出す必要があると私が知っているケースは 1 つだけです。placement new を使用する場合。
class Foo { /* lots of stuff here */ };
char foo[sizeof(Foo)];
new (&foo[0]) Foo();
/* ... */
reinterpret_cast<Foo *>(&foo[0])->~Foo();
なぜこれをしたいのかよくわかりませんが、とても簡単です:
M.~SparseMatrix();
一般に、他の関数と同じように呼び出すだけで、任意のクラスでデストラクタを明示的に呼び出すことができます。テンプレート化されたクラスも例外ではありません。