1

重複の可能性:
std::list::remove メソッドは、削除された各要素のデストラクタを呼び出しますか?

私がこれを持っていると仮定します:

void f(...)
{
    .
    .
    std::list<X*> xList;
    . 
    // Then i fill the list
    std::list<X*>::iterator iter;
    for (iter = xList.begin(); iter != xList.end(); ++iter)
    {
         *iter = new X();
    }

}

xList が範囲外になると、コンテナはリスト内に含まれるオブジェクトのデストラクタを呼び出す必要があることを知っていますか? まず、それは本当ですか?

もしそうなら、リストにはクラス X へのポインタが含まれているため、xList が範囲外になったときにデストラクタ ofX を呼び出すべきではありませんか? したがって、X によって保持されていたメモリを解放しますか?

4

2 に答える 2

3

はいといいえ。各要素のデストラクタが呼び出されます。ただし、これでは希望する効果は得られません。要素はタイプX*であるため、X*必要なXのデストラクタではなく、のデストラクタが呼び出されます(ポインタタイプには何もしません)。要素を明示的に削除する必要があります。一般に、newコードにある場合は、対応するが必要deleteです。

于 2012-10-21T16:40:29.260 に答える
1

C++ 標準ライブラリの設計では、コンテナは含まれる要素の唯一の所有者であるため、コンテナが破棄されるとすべての要素が破棄されます。

ただし、C++ でのネイキッド ポインターの「破棄」は無操作であるため、ポイント先の要素は削除されないことに注意してください (ネイキッド ポインターは、静的に割り当てられたデータまたは他のコンテナーが所有するデータを指す場合があります)。

あなたができることはstd::list、(要素へのポインターの代わりに)要素のいずれかを作成するか、(たとえば、ポリモーフィズムのためにポインターが必要な場合)代わりに、指定された要素を処理できるスマートポインターを使用できますあなたは好きです。

于 2012-10-21T16:46:00.627 に答える