0

最も奇妙なメモリリークがあり、その理由がわかりません。次のような抽象クラスがあります。

class ClassA
{
public:
    virtual ~ ClassA (){}
    virtual void notify(ClassB*) = 0;
    virtual void add(ClassB*) = 0;
}; 

class ClassC : public ClassA
{
public:
    void notify(ClassB*)
    { 
        //some cout statements
    }
    void add(ClassB*)
    { 
        //some cout statements
    }
};

int main()
{
    ClassA *f = new ClassC();
    delete f;
}

コードをコンパイルして Valgrind を実行すると、リークは発生しません。ただし、ClassA デストラクタを削除する (または非仮想にする) と、Valgrind は 32 バイトを確実に失われたメモリとして報告します。デストラクタが何もせず、メンバー変数がないため、なぜこれが起こるのかわかりません。何か案は?

編集: g++ を使用して Ubuntu 64 ビットでコンパイルしました

4

2 に答える 2

5

はい、未定義の動作によりメモリ リークが発生する可能性がありますvirtual。デストラクタを削除すると、メモリ リークが発生します。

C++03 5.3.5)

3) [...] 最初の選択肢 (delete object ) では、オペランドの静的型がその動的型と異なる場合、静的型はオペランドの動的型の基本クラスであり、静的型は仮想デストラクタまたは動作は未定義です。[...]

于 2012-09-09T15:11:33.173 に答える
1

他の回答が述べたように、それは確かにUBです。

失われた 32 バイトは、ClassC の隠しポインターから vtable へのものだと思います。

あなたの例で ClassA と ClassC の sizeof を比較してください...

仮想のものを持つクラスは、通常、そのメンバーの合計よりも大きくなります....

于 2012-09-09T15:55:14.180 に答える