0

他の誰かのコードで見始めたメモリリークエラーのためにヒープデバッグを有効にし、delete []以下の呼び出しの直後に、クラスのデストラクタに問題を特定しました(少なくともそう思います)。

MyClass::~MyClass() {
    delete [] my_class_member_;
}

ここで、構造体のオブジェクトへのポインタの配列であるmy_class_member_が、MyStructを使用してプロパティに割り当てられているnew []ことを確認したので、このリークの原因がわかりません。new []呼び出しは次のようになります。

delete [] my_class_member_;
my_class_member_ = new MyStruct[somesize_]; 

次に、構造体MyStructも比較的単純で、次のようになります(削除)。

struct MyStruct {
    MyStruct() {}
    ~MyStruct() {
        for( PtrList<PClass>::iterator it(ps); it.more(); it.next() ) {
            delete it.cur();
        }
        for( PtrList<RClass>::iterator it(rs); it.more(); it.next() ) {
            delete it.cur();
        }
        delete shift;
    }
    PtrList<PClass> ps;
    PtrList<RClass> rs;
};

これPtrListがポインタのリストです(私たちが使用しているアプリケーション開発キットの組み込み型)。私はそれが間違いではないことをかなり確信しています。とにかく、誰かがここで気づいたことは何かありますか?洞察に感謝します。

4

1 に答える 1

1

OPの要求に応じて、回答としてコメントを追加します。

三つのルールに従いましたか?
提示する情報から、そうするかどうかは明確ではありません。動的に割り当てられたメンバーのディープコピーを実行するコピーコンストラクターコピー代入演算子を提供する必要があります。そうしない場合、およびこれらの演算子の両方がそうでない場合未定義のままにしないと、それらがまったく使用されていないことを確認できません。これが問題の原因です。private

于 2012-06-13T18:14:11.593 に答える