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声明我应该声明我正在将珠子和脂质推入(几个)载体。
我错过了那个。我明白你的意思了。虽然人们应该小心共享所有权,因为在我看来,这是很少需要的东西,并且有缺点,特别是过度使用。