我最近意外地调用了一个RemoveItem
函数,它返回了一个我应该拥有(但没有)的指针,而不是调用返回void的DeleteItem
方法。
为了避免这种泄漏,从预期调用者获得返回对象所有权的函数返回的正确指针是什么?
Base * factory()
{
if (condition)
return new DerivedA;
else
return new DerivedB;
}
...
boost::scoped_ptr<Base> b(factory()); // no leak here
factory(); // but this leaks, obviously
factory()
应该返回共享指针以防止泄漏吗?
工厂的例子应该很熟悉,但这就是导致我出现问题的事情: -
void DeleteItem(ItemName); // delete named item from structure.
Item* RemoveItem(ItemName); // removes named item from the structure, and returns it.
//Caller can then re-insert it elsewhere.
RemoveItem("Fred"); // whoops! Should have called DeleteItem.
// Apart from the leak, everything appears OK...
答案 0 :(得分:1)
显而易见的解决方案是只有一个函数返回
和std::auto_ptr
(因为你说你没有C ++ 11)。这个
除非调用者这样做,否则将导致删除该对象
用它的东西。