2

「Pictureframe」のベクトル(pflist)があり、それらをすべて破棄したいと思います。だから私はpflist.clear();を実行します。ドキュメントには、これがベクター内の各アイテムのデストラクタを実行すると書かれていますが、そうではありません!

私は持っています:

vector<Pictureframe*> pflist;

そして、これが残りです:

class Pictureframe{
    scene::IMeshSceneNode *picture;
    scene::IMeshSceneNode *frame;

public:
    Pictureframe();
    ~Pictureframe();
};

次に、cppファイルで:

Pictureframe::~Pictureframe(){
//  delete picture;
//  delete frame;
    cout<<"Destructor Called.\n\n";
}

「デストラクタと呼ばれる」が見えない!これが私がそれを呼ぶところです:

pflist.clear();

私はこのラインが実行されていると確信しています、そしてそれは5つのピクチャーフレームによって占められています。ベクトルpop_back'ingを通過するforループも試しましたが、同じ問題がありました。

それで、デストラクタ、YU NO CALL?

4

2 に答える 2

7

あなたの質問は、のタイプが何であるかを述べていませんstd::vector。タイプがの場合、std::vector<Pictureframe *>を呼び出すときに各要素のデストラクタは呼び出されませんstd::vector::clear。この場合、ベクトルをクリアする前にdelete、これらのオブジェクトに対するあなたの責任です。

これらのオブジェクトを動的に割り当てる必要がない場合は、ベクトルタイプをに変更しstd::vector<Pictureframe>ます。次のように使用します。

std::vector<Pictureframe> vec;
vec.push_back( Pictureframe( ... ) );
// do stuff
vec.clear();

これで、各オブジェクトのデストラクタが呼び出されます。Pictureframeクラスがいくつかのリソースを管理しているように見えるので、コピーコンストラクタと代入演算子を作成することを忘れないでください。

オブジェクトを動的に割り当てる必要がある場合Pictureframeは、ベクトルを次のように変更します。

std::vector<std::unique_ptr<Pictureframe>> vec;
vec.push_back( std::unique_ptr<Pictureframe>( new Pictureframe( ... ) ) );
// do stuff
vec.clear();

unique_ptrdeleteこの場合、オブジェクトは自動的に作成されます。

他の選択肢はまたはboost::shared_ptrの代わりstd::unique_ptrですboost::ptr_vector

于 2012-05-22T05:37:48.707 に答える
2

std::vector<Pictureframe *>
Any標準ライブラリコンテナは、動的に割り当てられたポインタ要素をクリアする責任を負わないこと を確信しています。

を繰り返し処理して、各要素std::vectorを呼び出す必要があります。delete

古い質問に対する私のこの答えは、よく読んでおく必要があり
ます。vector:: Erase()は、削除されたオブジェクトを破棄しますか?

于 2012-05-22T05:24:54.233 に答える