C++ 如何删除C+中新运算符占用的内存+;
可能重复:C++ 如何删除C+中新运算符占用的内存+;,c++,C++,可能重复: 我是C++内存分析中的新手。 Valgrind报告这条管线有泄漏 m_propertyManager(new coral::PropertyManager); 所以我把它改成 coral::PropertyManager Mgr; m_propertyManager(&Mgr); 我猜&Mgr会自动删除,但valgrind再次报告此漏洞。new coral::PropertyManager会在堆上分配一个新的PropertyManager,但因为它是一个临时变量,所以您
<>我是C++内存分析中的新手。 Valgrind报告这条管线有泄漏
m_propertyManager(new coral::PropertyManager);
所以我把它改成
coral::PropertyManager Mgr;
m_propertyManager(&Mgr);
我猜
&Mgr
会自动删除,但valgrind再次报告此漏洞。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持有对无效内存的引用。如果您使用
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
- 在
中实现move-ctor并按值传递(这样PropertyManager
将隐式自动分配自己的m\u PropertyManager
实例)PropertyManager
- 使用静态分配(如第二个示例中所示),但将实例保留在适当的位置,在
期间,实例将保持活动状态m_propertyManager
- 在m_propertyManager中使用某种自动指针(如std::shared_ptr或std::unique_ptr)