0

だから私はこのC++プログラムを書いていて、おかげでメモリリークをかなり絞り込みましたvalgrind. しかし、まだ大量のリークが残っています。しかし、私のvalgrind出力は意味がありません:

9,512 (7,104 direct, 2,408 indirect) bytes in 148 blocks are definitely lost in loss record 4 of 4

==2638==    at 0x402B9B4: operator new(unsigned int) (in /usr/lib/valgrind
/vgpreload_memcheck-x86-linux.so)
==2638==    by 0x804C8AD: __gnu_cxx::new_allocator<std::vector<plate, std::allocator<plate> > >::allocate(unsigned int, void const*) (in /home/.../program)
==2638==    by 0x804C2FF: std::_Vector_base<std::vector<plate, std::allocator<plate> >, std::allocator<std::vector<plate, std::allocator<plate> > > >::_M_allocate(unsigned int) (in /home/.../program)
==2638==    by 0x804B7F7: std::vector<std::vector<plate, std::allocator<plate> >, std::allocator<std::vector<plate, std::allocator<plate> > > >::_M_insert_aux(__gnu_cxx::__normal_iterator<std::vector<plate, std::allocator<plate> >*, std::vector<std::vector<plate, std::allocator<plate> >, std::allocator<std::vector<plate, std::allocator<plate> > > > >, std::vector<plate, std::allocator<plate> > const&) (in /home/.../program)
==2638==    by 0x804AF48: std::vector<std::vector<plate, std::allocator<plate> >, std::allocator<std::vector<plate, std::allocator<plate> > > >::push_back(std::vector<plate, std::allocator<plate> > const&) (in /home/.../program)
==2638==    by 0x804A57C: hanoi_object::hanoi_object(hanoi_object const&) (in /home/.../program)
==2638==    by 0x804A6C9: hanoi_object::getMoves() const (in /home/.../program)
==2638==    by 0x8048FE1: Solver::solve(std::Config*, std::Config*) (in /home/.../program)
==2638==    by 0x804A0D3: main (in /home/.../program)

プログラムの概要〜必要に応じてスキップしてください。

私のプログラムは、基本的に、幅優先探索アルゴリズムを使用して解決する初歩的なハノイ パズル ソルバーです。ここで、パズル自体をプレート オブジェクト ( vector< vector< plate > >) の double ベクトルで表します。ここで、プレートは、1 つの整数値 (ディスクの重量またはサイズ) を保持する単純なクラスにすぎません。と呼ばれるクラスhanoi_objectは、これらのオブジェクトの収集、表現、移動、および維持を担当します。ソルバー クラスは後でhanoi_objectsヒープにさまざまなものを割り当て、探しているものでない場合は削除します。

それによるとvalgrind、プレートオブジェクトの二重ベクトルに問題があるようです。しかし、なぜ?これは単純な値を含むクラスでありint、ヒープにプレート オブジェクトを割り当てることはありません。ハンドラー/コントローラー オブジェクト ( hanoi_object) をヒープに割り当てると、二重ベクトル プレート オブジェクトなども割り当てられますか?

デストラクタは次のとおりです。

hanoi_object::~hanoi_object(){
    for(int i=0; i<pegs_.size(); i++){
        pegs_[i].clear();
    }
    pegs_.clear();
}

そして、コピー コンストラクター:

hanoi_object::hanoi_object(const hanoi_object& hanoi_object){
    for(int i = 0; i < hanoi_object.pegs_.size(); i++){
        vector<plate> PL;
        for(int j = 0; j < hanoi_object.pegs_[i].size(); j++){
            plate somePlate(hanoi_object.pegs_[i][j].getWeight());
            PL.push_back(somePlate);
        }
        pegs_.push_back(PL);
    }
}

hanoi_object のすべての割り当ては他の関数にあり、それらが削除されているか、別のクラスに渡されていることを確認するためにトリプル チェックを行いました。

4

2 に答える 2