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

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推入(几个) vector 中。

编辑
好的,添加delete head ..修复了该问题,但是我仍然有一个痛苦的问题,我有一行:
this->beadBoxes[t[0]][t[1]][t[2]].push_back(b);

其中t是大小为3的vector<int>,而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)

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

最佳答案

就像其他海报很好地解释的那样,这些丢失的块是已分配但从未释放的内存,因此将永远无法在程序的同一运行中再次使用。

当您尝试长时间运行程序并需要许多新的脂质结构时,这是一个确定的问题。从软件工程POV,您必须释放内存。但是,您似乎是在科学的环境中编程,因此,我想补充一点,您的结果不受丢失的重新分配的影响,并且从科学家的观点出发,您也许可以承受这里的草率。

09-06 19:25