这个Valgrind输出是什么意思?

时间:2013-04-28 07:04:26

标签: c++ valgrind

所以我正在编写这个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 > >)来表示拼图本身,其中板只是一个简单的类,它包含一个整数值,即磁盘的重量或大小。名为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中的所有分配都在其他函数中,我进行了三重检查,以确保删除它们或传递给另一个类。

2 个答案:

答案 0 :(得分:0)

您的复制构造函数hanoi_object::hanoi_object(hanoi_object const&)似乎正在分配您的析构函数未释放的某些内容(可能包含new)(使用delete)。看起来它是plate s的双向量。更重要的是,如果没有看到复制构造函数和析构函数的代码,我们就不能说了。


跟踪中“系统”和“用户”功能之间的界限位于:

  • 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&)
  • hanoi_object::hanoi_object(hanoi_object const&)

这向我表明复制构造函数中的两个push_back调用之一正在进行损坏。鉴于类型信息,我认为这是第二个这样的呼叫:

pegs_.push_back(PL);

从形式上讲,我们无法从给出的信息中判断pegs_是全局变量还是类成员(是的,我知道;它可能是一个类成员,但我们无法确定,因为你我们甚至没有向我们展示班级定义的概要。)

在析构函数中,您clear pegs_变量。这将删除并销毁向量中的所有元素;它不会释放载体本身。

答案 1 :(得分:0)

  

我从不在堆上分配任何板块对象。

vector 在堆上分配。

只需信任 valgrind。他抱怨的那条线路分配了从未被释放的内存。