我只是困惑,我看到了一些这样的代码,
CFoo& fmethod()
{
static CFoo *pfoo = new CFoo;
return *pfoo
}
这里有内存泄漏吗?pfoo什么时候会被删除?
我只是困惑,我看到了一些这样的代码,
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
作为函数的评论static
)还要注意,由于pfoo
是函数静态的,分配只发生一次。删除也只需要发生一次。在这种情况下要遵循的典型模式是使用智能指针而不是常规指针,如下所示:
CFoo& fmethod()
{
static std::unique_ptr<CFoo> pfoo(new CFoo);
return *(pfoo.get());
}
如果你这样做,智能指针会自动消除泄漏,调用者不需要考虑删除对象。