C ++本地对象超出范围返回指针(使用new分配的内存)。因此导致内存泄漏

时间:2016-05-06 12:35:25

标签: c++ memory-leaks delete-operator

此功能中报告了内存泄漏。我无法理解为什么这不能释放记忆?

示例代码:

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)如果这不是释放记忆的正确方法,那么我哪里出错并且正确的方法是什么?

1 个答案:

答案 0 :(得分:2)

规则非常简单:每个 new必须与delete平衡。

如果您的代码没有完全平衡这些代码,则会出现未定义的行为或内存泄漏。在您的情况下,使用逐行调试器检查是非常简单的。

lc类的一个问题是可以复制它(使用编译器生成的复制构造函数),它将浅复制指针成员。很难跟踪哪个对象(如果有)“拥有”由another分配的内存。

你可以尝试打磨这个课程。但实际上,您可以放弃整个事情,而是使用std::unique_ptrstd::shared_ptr,具体取决于您的具体要求。这些课程为您管理delete和(除非您反过来使用它们)保证 newdelete是平衡的。