1

みんなのおかげで、プロジェクト全体をもう一度チェックした後、実際の問題は仮想デストラクタの欠落でした....それが原因でメモリリークが発生しました...

#include "stdafx.h"
#include <vector>

class VecContainerParent
{
public:
    VecContainerParent(){};

この行がない場合:

    virtual ~VecContainerParent(){};

それはメモリリークを引き起こします

};

class VecContainerChild : public VecContainerParent
{
public:
    VecContainerChild(){};

    //virtual ~VecContainerChild(){};
private:
    std::vector<int> vec;
};

////////// WITH MEMORY LEAK ///////////////


int _tmain(int argc, _TCHAR* argv[])
{
    VecContainerParent *a;
    while(true)
    {
        a = new VecContainerChild();
        delete a;
    }
} 

///// 元の投稿 ////////// クラス内でベクトルを使用し、このオブジェクトを new & delete で使用すると、メモリ リークの問題が発生します。クラス内のベクトルがメモリを解放していないようです。これをテストするために、プロセスのメモリが劇的に増加することをタスクマネージャーで確認します。

以下の例を参照してください。

class VecContainer
{
public:
       VecContainer(){};
private:
       std::vector<int> vec;
}
  1. メモリリークあり:

    int main()
    {
        VecContainer *a;
        while(true)
        {
            a = new VecContainer();
            delete a;
        }
    }
    
  2. 良い (ptr を使用していないため):

    int main()
    {
        while(true)
        {
            VecContainer a;
        }
    }
    
4

1 に答える 1

3

それは典型的です。あなたが

   a = new VecContainerChild();
    delete a;

基本クラスのサブオブジェクトへのポインタを介してオブジェクトを削除すると、基本クラスに仮想デストラクタがない限り、未定義の動作が呼び出されます。基本的に、この場合、子のデストラクタは実行されません。

これはもっと勉強すべき問題かもしれません。

于 2012-04-19T14:17:52.227 に答える