2

クラスプロジェクトのコードを書いています。タスクの 1 つは、作成したクラスへのポインターのコレクションを削除することです。解決策は次のようになります。

CDocument::~CDocument()
{
    for(std::list<CActor*>::iterator it = mActors.begin(); it != mActors.end(); it++)
    {
        delete *it;
    }

    mActors.clear();

}

私の解決策は次のようになりました:

CDocument::~CDocument()
{
    for(std::list<CActor*>::iterator it = mActors.begin(); it != mActors.end(); it++)
    {
        delete **it;
    }
}

私の混乱は、イテレータの逆参照から生じています。リストから CActor オブジェクトを削除したいと考えています。この場合、反復子はポインターへのポインターを提供します。メモリ内の実際のオブジェクト **it ではなく、CActor ポインター *it を削除する必要があるのはなぜですか? また、追加の mActors.clear() はなぜですか?

4

1 に答える 1

3

オブジェクト自体やオブジェクトへの参照ではなく、ポインターで動作するためdelete..たとえば、コードで

int* a = new int;

で削除aします

delete a;

いいえ

delete *a;

なぜそこにあるのかというと、デストラクタが自動的に同じことをするmActors.clear();ので、厳密には必要ありません。std::listただし、デストラクタにさらにコードが追加された場合は、リストをクリアすることで、これらのダングリング ポインタが後で誤って使用されるのを防ぐことができます。

于 2013-10-24T01:56:57.977 に答える