此功能中报告了内存泄漏。我无法理解为什么这不能释放记忆?
示例代码:
void Somefunction(){
Object1 * dangler = StaticClass::myFunc();
/*...
...some processing using dangler
...*/
delete dangler;
}
Object1* StaticClass::myFunc(){
LocalObj lc;
lc.another();
return lc.get();
}
Class lc{
Object1* m_dangler;
void another(){
m_danlger = new Object1();
}
Object1* get(){
return m_danlger;
}
}
此delete danlger;
无效,我在Object1 * dangler = StaticClass::myFunc();
看到内存泄漏
问题是:
1)当指针danlger
确实指向该位置时,为什么我无法删除。
2)如果这不是释放记忆的正确方法,那么我哪里出错并且正确的方法是什么?
答案 0 :(得分:2)
规则非常简单:每个 new
必须与delete
平衡。
如果您的代码没有完全平衡这些代码,则会出现未定义的行为或内存泄漏。在您的情况下,使用逐行调试器检查是非常简单的。
lc
类的一个问题是可以复制它(使用编译器生成的复制构造函数),它将浅复制指针成员。很难跟踪哪个对象(如果有)“拥有”由another
分配的内存。
你可以尝试打磨这个课程。但实际上,您可以放弃整个事情,而是使用std::unique_ptr
或std::shared_ptr
,具体取决于您的具体要求。这些课程为您管理delete
和(除非您反过来使用它们)保证 new
和delete
是平衡的。