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

C++ Local object goes out of scope returning a pointer (memory allocated using new). Memory leak because of this

本文关键字:内存 分配 new 使用 泄漏 指针 对象 返回 范围 C++      更新时间:2023-10-16

此函数中报告了内存泄漏。我不明白为什么这不能释放内存?

样本代码:

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) 如果这不是释放内存的正确方法,我哪里错了,正确的方法是什么?

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

如果你的代码不能准确地平衡这些,那么你就有了未定义的行为或内存泄漏。在您的情况下,使用逐行调试程序进行检查是很琐碎的。

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

你可以试着改进这门课。但实际上,根据您的具体要求,您还可以放弃整个功能,转而使用std::unique_ptrstd::shared_ptr。这些类为您管理delete,并且(除非您反常地使用它们)保证news和deletes是平衡的。