Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我该如何关注valgrind的损失_C++_Memory Leaks_Valgrind - Fatal编程技术网

C++ 我该如何关注valgrind的损失

C++ 我该如何关注valgrind的损失,c++,memory-leaks,valgrind,C++,Memory Leaks,Valgrind,在我的代码中,我有一个类lipid,它包含三个beads: 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:

在我的代码中,我有一个类
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;
}
当我修改我的代码时,我得到一个错误,声称有大量的块丢失。。。我该怎么担心呢?我应该说明我正在将
s和
脂质
s推入(几个)向量

编辑 好,添加
删除磁头
。。修正了这个问题,但我仍然有一个疼痛的问题,我有一句话:

this->beadBoxes[t[0]][t[1]][t[2]].push_back(b);
其中,
t
是一个大小为3的
向量,
beadbox
是:

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

根据您的代码,我想Valgrind想告诉您的是内存泄漏

在堆上分配某些对象后:

lipid * l = new lipid;
l->head = new bead;
l->body = new bead;
l->tail = new bead;
您还应该适当地删除它们以恢复内存。事实上,您的类缺少一个析构函数,您可以在其中进行清理。。。您可以尝试以下方法:

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;
然后像这样使用它:

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;

您首先不应该使用原始指针。
使用,这是解决您遇到的问题的最佳方法。使用智能指针将确保一旦没有指针再引用对象,对象本身将负责解除分配

看看


就您发布的源代码而言,您从未解除分配动态分配的对象,因此内存泄漏。

您是否释放了使用
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

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

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


更好的方法是使用
shared\u ptr
s处理所有事情。甚至只是使用堆栈;从您给出的设计来看,实际上根本不需要指针(尤其是裸指针)

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


当你试图运行你的程序更长的时间,需要许多新的脂质结构,这是一个决定性的问题。从软件工程的角度来看,您必须释放内存。然而,您似乎是在科学背景下编程的,因此我想补充一点,您的结果不会受到丢失的分配的影响,从科学家的角度来看,您可能可以负担得起在这里马虎。

Um-您是否删除了珠子+脂质?显然,如果你不删除它们,你会得到泄漏…不,它们会一直保留到运行结束。当我只创建脂质(没有珠子)时,没有这样的消息。为什么,当我不创建珠子但只有脂质时,没有泄漏?如果你删除
l
lipide?我不删除它们,它们会一直保留到运行结束。我在
类脂
中添加了一个析构函数,它可以正常工作。我在问题中添加了一个部分,这就是我发现这个错误的原因。为什么在没有明显共享的情况下,你推荐共享的ptr?@daramarak:因为OP声明
我应该声明我正在将珠子和脂质推入(几个)载体。
我错过了那个。我明白你的意思了。虽然人们应该小心共享所有权,因为在我看来,这是很少需要的东西,并且有缺点,特别是过度使用。