0

プライベート会員がいます

std::list<MyClass*> myclass_list;

これは OtherClass の一部です。

コンソール アプリケーションを閉じると、OtherClass の空のデストラクタが呼び出されます。問題は、デストラクタの呼び出し中に - OtherClass 内のいくつかのメソッドが myclass_list を反復処理したい - などです。

for(std::list<MyClass*>::iterator it = myclass_list.begin(); it != myclass_list.end(); ++it) {      
    // do stuff
}

現在、myclass_list が空であっても (そして、その存続期間中に単一の変数が割り当てられたり追加されたりすることはありません) - for ループは少なくとも 1 回反復されます - 基本的に、存在しない MyClass オブジェクトにアクセスします。

std::list から std::vector に切り替えると、これはすべてなくなります。

  1. ここにリストされている STL (VS2010) の問題は何ですか? 無効なリストをチェックするにはどうすればよいですか (!= 0 または !vector は機能しません。オーバーロードされた演算子はありません)。
  2. ベクターは連続メモリを使用し、ループが実行されないため、ベクターでは問題なく動作すると思います。

編集:問題は、現在、デストラクタが呼び出されている無効な Otherclass オブジェクトにアクセスすることにあると思います。Otherclass はグローバル オブジェクトです。

ワークフロー ~OtherClass -> someMemberObject を削除 -> ~someMemberObject -> otherclass->CheckMyClassList(someMemberObject) -> クラッシュ

4

1 に答える 1

1

メンバー変数のデストラクタは、宣言の逆順で呼び出されます。

したがって、メンバー変数のデストラクタが他のメンバー変数にアクセスする必要がある場合は、使用される変数をに宣言する必要があります。

class OtherClass
{
    std::list<MyClass*> myclass_list;
    someMemberObject member;
};

変数が逆の順序で定義されている場合、 が呼び出されたとき~someMemberObject()myclass_listデストラクタが呼び出され、それを使用すると未定義の動作が発生します。

于 2012-07-02T22:14:55.153 に答える