0

私はstd::vector大量の を保持するために に依存していEigen::MatrixXdます。C++ の専門家ではない私は、このタイプの構造体でメモリ割り当てを適切に管理するにはどうすればよいか疑問に思っています。特に、私の質問は、それをクラスメンバーとして使用して、クラスデストラクタで割り当てられたメモリを解放するにはどうすればよいですか?

std::vector を使用します。Eigen::MatrixXd を使用します。

Class myClass{
    //...
    vector<MatrixXd> container;

    //...
    myClass();
    ~myClass();
}

のコンストラクタとデストラクタmyClass:

myClass::myClass(){
    //...
    container=vector<MatrixXd>(100);
    for (int i=0; i<container.size(); i++) container[i]=MatrixXd::Zero(100,100);
    //...
}

myClass::-myClass(){
    //...
    for (int i=0; i<container.size(); i++) container[i].resize(0,0);
    container.clear();
    //...
}

すでに固有行列のサイズを (0,0) に変更しているので、 を呼び出すだけで十分ですかclear()、それとも を使用する必要がありdeleteますか? vector<MatriXd*>代わりに使用する利点はありますか?

4

3 に答える 3

2

MatrixXdアイテム タイプとしてのデストラクタは、 destructing 中に呼び出されstd::vectorます。したがって、それらを削除することについて心配する必要はありません。std::vector::~vector():

コンテナを破棄します。要素のデストラクタが呼び出され、使用されているストレージの割り当てが解除されます。要素がポインタの場合、ポイント先のオブジェクトは破棄されないことに注意してください。

于 2013-10-13T18:04:19.200 に答える
1

C++ でのクラスの優れた設計の全体的なポイントは、それらを破棄するときに、保持しているリソースを適切に解放することです。std::vectorとはどちらもMatrixXd正しく設計されているため、何もする必要はありません。デストラクタは空にすることができます。

これは、 C から C++ に移行するときに絶対に行わなければならない大きな精神的飛躍です。C++ では、それ以上苦労せずに単純に破棄できる場合、そのクラスは適切に作成されたと見なされます。クラスが破壊可能であるという事実は、不変であるべきです - クラスインスタンスが存在する間のすべての時点で、そのインスタンスは破壊可能でなければなりません。クラスを破棄すると、保持しているすべてのリソースが解放されます。

リソースを解放しないことは、C++ を本来の使用方法で活用しない C スタイルの設計では、際限のない悲しみの原因となります。

于 2013-10-13T19:31:38.557 に答える