如何在C++中删除新操作符占用的内存
how to delete memory occupied by new operator in C++
可能重复:
为什么使用"new"会导致内存泄漏?
我是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
显式释放它 - 在
PropertyManager
中实现move-contor并传递值(这样m_propertyManager
将隐式自动分配自己的PropertyManager
实例( - 使用静态分配(如第二个示例中所示(,但将实例保留在该位置,在该位置它将保持活动至少与
m_propertyManager
一样长 - 在m_propertyManager中使用某种自动指针(如std::shared_ptr或std::unique_ptr(
相关文章:
- c++新操作符通过libstdc++占用大量内存(67MB)
- 新操作符(以及malloc)无法分配~450MB的内存
- 当delete操作符释放内存时,我为什么需要析构函数
- c++中不使用new操作符的内存泄漏
- 如何从操作符new或mremap的malloc中获取页对齐内存
- 操作符new已在带有库的自定义内存管理器中定义
- 编译器如何知道使用哪个操作符或函数分配了哪些内存
- c++是delete操作符重写内存
- c++内存泄漏新操作符
- 内存管理:使用new操作符进行数组和动态分配
- 间接操作符是否更改内存表示
- 通过结构和重载操作符包装CUDA共享内存定义和访问
- 在c++中重写+操作符时可视地分配内存
- 操作符new将内存初始化为零
- delete[]操作符是否适用于通过指针返回的动态分配的内存?
- 重载操作符内存泄漏=
- 内存分配操作符和表达式
- 如何重载操作符new和delete来跟踪内存
- 释放在函数重载操作符中分配的内存
- 赋值操作符内存泄漏