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

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

    return *pfoo
}


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

最佳答案

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


答案取决于调用者:由调用者决定是通过引用还是通过指针接收结果,然后调用delete。如果这样做,就不会漏水

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


如果你这样做

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


返回值fmethod()泄漏。

不言而喻,以上所有都是相当不自然的,因此应避免使用。

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

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

    return *(pfoo.get());
}


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

关于c++ - 实例分配在堆中,但作为引用返回,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18950606/

10-09 06:40