所以我正在编写这个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)
程序摘要~如果你想跳过。
我的程序基本上是一个基本的 Hanoi 谜题求解器,使用广度优先搜索算法来求解。现在,我用板对象的双向量 ( ) 来表示拼图本身vector< vector< plate > >
,其中板只是一个简单的类,它包含一个整数值,即磁盘的重量或大小。一个名为的类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 中的所有分配都在其他函数中,我已经三重检查以确保这些分配被删除或传递给另一个类。