Valgrind报告我的代码(如下所示)导致内存泄漏。
view *vi = new view(IPs);
initialView = *vi;
//delete vi;
所以,我添加了删除。但是删除vi会使initialView
变空!并且导致valgrind的几个问题。我该怎么办?
顺便说一下,这是类视图的相等运算符!
view & operator = (const view& v){
vp = std::vector <process>(v.vp);
return *this;
}
答案 0 :(得分:2)
使用new
命令时,会从堆或空闲存储中为指针分配内存位置。问题是,在通过指针使用此内存位置后,程序员必须使用delete
命令显式地取消分配该内存块。否则,程序将耗尽动态内存并崩溃。基本上,这就是内存泄漏所导致的。
当使用delete pointer
时,它只是将pointer
的值重置为null,并使内存块可以重新使用。您所要做的就是删除指定使用后使用的指针。
例如:
for(int i=0;i<1000;i++)
{
int* ptr=new int;
*ptr=i;
cout<<*ptr; // ptr has been used, don't need it anymore
delete ptr; //if you don't use this, memory leak will occur
}
答案 1 :(得分:1)
如果可能,您可以将此原始指针替换为shared_ptr
。它基于引用计数,因此当没有人指向它时可以处理释放内存。
答案 2 :(得分:1)
从你的代码中,很难说。您在标题中引用了哪些静态变量?
为了让valgrind高兴,你当然必须删除vi
。在您的代码中,我无法在分配后看到initialView
和vi
之间的任何依赖关系 - 向量构造函数会创建v
进程列表的副本,并且如果这些进程没有被vi
删除,这应该没问题。如果存在导致问题的其他依赖项,请尝试消除它们。