我是C ++内存分析的新手。 Valgrind报道了这条线的漏洞
m_propertyManager(new coral::PropertyManager);
所以我将其修改为
coral::PropertyManager Mgr;
m_propertyManager(&Mgr);
我猜&Mgr
会自动删除,但valgrind再次报告泄密。
答案 0 :(得分:0)
new coral::PropertyManager
在堆上分配一个新的PropertyManager,但因为它是一个临时变量,所以你永远不会释放它。这是标准的Java习惯用法,因为Java是一种垃圾收集语言,GC将负责为您发布这个悬空引用。
如果您出于某种原因想在此使用new
,正确的方法如下:
auto *pm = new coral::PropertyManager; // auto is C++11 syntax
m_propertyManager(pm);
delete pm; // when you're done using it
你的第二个选项是正确的,因为它在堆栈上分配Mgr
作为自动变量,当函数退出时将释放它。 m_propertyManager(&Mgr);
将Mgr的地址传递给函数,这将允许它修改Mgr对象(尽管通过传递Mgr作为参考可能更好。)
请注意,如果m_propertyManager是在当前作用域退出后仍然存在的对象,并且如果它将引用存储到Mgr某处,则当您退出当前作用域并且Mgr对象被销毁时,您会发现m_propertyManager持有对内存无效。
答案 1 :(得分:0)
如果您使用new
分配内存,则必须使用delete
将内容释放。如果m_propertyManager
不应该管理PropertyManager
的生命周期,它只会抛出指针而不分配内存并且无法访问。
另一方面,你的第二个解决方案会崩溃。看:
{
coral::PropertyManager Mgr;
m_propertyManager->SetManager(&Mgr); // You pass pointer to Mgr here
}
// Here Mgr no longer exists, so m_propertyManager
// now contains the pointer to non-existing object
你应该:
PropertyManager
(使用new
),在某处按住指针,然后使用delete
明确释放它; PropertyManager
中实施move ctor并按值传递(这样m_propertyManager
将隐式自动分配自己的PropertyManager
实例)m_propertyManager