内存泄漏点
问题描述:
我有以下代码,并询问是否有任何内存泄漏。我相信“function”里面有内存泄漏,因为在a = new A()之后没有删除操作。 。我对吗?内存泄漏点
class A
{
public:
A(){};
~A(){};
private:
double d[10];
};
void function (A* a)
{
delete a;
a = new A();
}
void main (void)
{
A* p = new A();
function(p);
delete p;
}
答
这个程序应该崩溃和失去记忆。
因为主释放内存p
而崩溃,这已经在function
内部发布。
失去内存,因为在function
中分配的a
未被返回,并且在内部为function
。
答
基本上我认为会有什么误解。
你是对的,它是一个传递指针。这意味着该地址被压入被调用函数的堆栈(或放入一个寄存器,取决于调用约定)。堆栈(或寄存器)中的这个地址用于释放对象。最后,这个地址将被新操作员返回的地址覆盖。
所以p没有改变,因为它在不在被调用者的调用者堆栈中。
+0
感谢您的解释。我怎样才能解决这个问题?我应该使用智能指针还是引用来避免内存泄漏? – Billyx24
是的你是对的。 –
它比仅仅有一个内存泄漏更糟......你也是在函数(A * a)和main()中一次删除A ...的第一次分配。 – aSteve
还有一个双重删除,因为'p'被删除两次,一次在'function'中,一次在'main'中。 –