在堆中分配的实例但返回为参考

时间:2013-09-23 01:33:49

标签: c++

我只是困惑,我看到了一些像这样的代码,

CFoo& fmethod()
{
    static CFoo *pfoo = new CFoo;

    return *pfoo
}

这里有内存泄漏吗?何时删除pfoo?

1 个答案:

答案 0 :(得分:1)

  

这里有内存泄漏吗?何时删除pfoo

答案取决于调用者:调用者可以通过引用或指针接收结果,并调用delete。如果你这样做,就没有泄漏

CFoo& x(fmethod());
delete &x; // No leak
CFoo* y = &fmethod();
delete y; // No leak    

如果你这样做

CFoo x(fmethod()); // Memory leak

fmethod()的返回值泄漏。

不言而喻,上述所有内容都相当不自然,因此应该避免使用。

注意:(响应关于pfoo正在运行的评论 - static)另请注意,由于pfoo是函数静态的,因此分配发生只有一次。删除也只需要发生一次。在这种情况下要遵循的典型模式是使用智能指针而不是常规指针,如下所示:

CFoo& fmethod()
{
    static std::unique_ptr<CFoo> pfoo(new CFoo);

    return *(pfoo.get());
}

如果这样做,智能指针会自动消除泄漏,调用者无需考虑删除对象。