我应该如何关注valgrind遭遇的损失

时间:2011-08-02 09:15:32

标签: c++ memory-leaks valgrind

在我的代码中,我有一个类lipid,其中包含三个bead s:

struct lipid{
  particle mainPart;
  bead * head;
  bead * body;
  bead * tail;
  int LID;
  vec direction;
  bead * operator[](int index){
    switch(index){
    case 0: return head;
    case 1: return body;
    case 2: return tail;
    default: return body;
    }
  }
};


struct bead{
  particle mainPart;
  int charge;
  int type;
  double rho;
  double nextRho;
  int LID;
  double U;
  double nextU;
  bool touch;
};


struct particle{
  vec pos;
  vec oldPos;
  vec vel;
  vec oldVel;
  vec F;
  vec oldF;
 };

class vec{
  velarry<double> coor;
  double x;
  double y;
  double z;
}

当我尝试制作脂质时,我使用新的

创建了三个珠子
lipid * l = new lipid;
l->head = new bead;
l->body = new bead;
l->tail = new bead;

当我对我的代码进行修改时,我收到一个错误,声称有大量的块丢失了......我应该如何关注它?我应该声明我正在将beadlipid s推入(几个)向量中。

修改 好的,添加delete head ..解决了这个问题,但我仍然有一个疼痛的问题,我有一条线:

this->beadBoxes[t[0]][t[1]][t[2]].push_back(b);

其中tvector<int>的大小为3且beadsBoxes为:

<vector<vector<vector<vector<bead*> > > > beadBoxes;

这家伙给了我5次内存泄漏错误:

==22458== 48 bytes in 2 blocks are definitely lost in loss record 11 of 106
==22458==    at 0x4A0666E: operator new(unsigned long) (vg_replace_malloc.c:220)
==22458==    by 0x419A3C: __gnu_cxx::new_allocator<bead*>::allocate(unsigned long, void const*) (new_allocator.h:88)
==22458==    by 0x419A64: std::_Vector_base<bead*, std::allocator<bead*> >::_M_allocate(unsigned long) (stl_vector.h:127)
==22458==    by 0x423E1F: std::vector<bead*, std::allocator<bead*> >::_M_insert_aux(__gnu_cxx::__normal_iterator<bead**, std:\
:vector<bead*, std::allocator<bead*> > >, bead* const&) (vector.tcc:275)
==22458==    by 0x424073: std::vector<bead*, std::allocator<bead*> >::push_back(bead* const&) (stl_vector.h:610)
==22458==    by 0x409664: membrane::updateBox(bead*) (membrane.cpp:874)
==22458==    by 0x40ACA5: membrane::decide(lipid*) (membrane.cpp:793)
==22458==    by 0x40DF01: membrane::rotate() (membrane.cpp:529)
==22458==    by 0x40DFAF: membrane::MCstep() (membrane.cpp:480)
==22458==    by 0x401B54: main (main.cpp:15)

我怀疑可能与发生的分段错误有关。为什么会出现新的(无符号长整数)以及为什么会抛出分段错误?

5 个答案:

答案 0 :(得分:3)

您是否释放了使用new分配的对象?

对于一致的行为,您应该考虑使用构造函数和析构函数:

struct lipid{
    // constructor
    lipid() {
        this->head = new bead;
        this->body = new bead;
        this->tail = new bead;
    }
    // destructor
    ~lipid() {
        delete this->head;
        delete this->body;
        delete this->tail;
    }
    ... // rest of the class

答案 1 :(得分:2)

不应该首先使用Raw指针 使用 Smart pointers & RAII ,这是您遇到的问题的最佳解决方案。使用智能指针可确保一旦没有指针引用它们,对象本身就会处理释放。

查看 shared_ptr

就您发布的源代码而言,您永远不会释放动态分配的对象,从而导致内存泄漏。

答案 2 :(得分:2)

当然你有泄漏;你没有释放你的记忆。

在脂类中定义一个破坏珠子的析构函数,当你将动态分配的脂质存储在载体中时,使用 RAII shared_ptr或类似的。

更好的是,将shared_ptr用于所有事情。甚至只是使用堆栈;根据你给出的设计,无论如何都不需要指针(特别是裸指针)

答案 3 :(得分:1)

从你的代码中,我想Valgrind试图告诉你的是你有内存泄漏。

在堆上分配一些对象后:

lipid * l = new lipid;
l->head = new bead;
l->body = new bead;
l->tail = new bead;

你也应该delete他们适当地恢复记忆。实际上,你的脂质类缺少一个你要清理的析构函数......你可以试试这样的东西:

struct lipid{
  particle mainPart;
  bead * head;
  bead * body;
  bead * tail;
  ~lipid() {
      delete head;
      delete body;
      delete tail;
  }
  ...
};

并像这样使用它:

 lipid * l = new lipid;
l->head = new bead;
l->body = new bead;
l->tail = new bead;

...

//-- when you are done with lipid:
delete l;

答案 4 :(得分:1)

与其他海报一样出色地解释,这些丢失的块是已分配的内存,但从未被释放,因此在程序的同一运行中永远不会再次使用。

当您尝试运行程序较长时间并需要许多新的脂质结构时,这是一个明确的问题。从软件工程POV中,您必须释放内存。然而,你似乎是在一个科学的背景下编程,因此我想补充一点,你的结果不会受到缺失的释放的影响,而且从科学家的POV中,你可能能够承受这里的草率。