如何在C ++中删除new运算符占用的内存

时间:2013-01-09 11:58:23

标签: c++

  

可能重复:
  Why does the use of ‘new’ cause memory leaks?

我是C ++内存分析的新手。 Valgrind报道了这条线的漏洞

m_propertyManager(new coral::PropertyManager);

所以我将其修改为

coral::PropertyManager Mgr;
m_propertyManager(&Mgr);

我猜&Mgr会自动删除,但valgrind再次报告泄密。

2 个答案:

答案 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
  • ,就将实例保留在至少的位置。
  • 在m_propertyManager中使用某种自动指针(如std :: shared_ptr或std :: unique_ptr)