2013-06-12 23 views
0

下面的代码是表示存储器管理的不良例子的图。项目永远不会被分配,因为它的临时副本将被返回。如何避免返回一个临时对象(C++)

我已经冲刷和关闭数周的编程论坛,但还没有找到一个明确的解释,如何正确的返回类型项目的有效实例*而被取消分配允许项目。 换句话说,完成相同的返回值并允许项目被取消分配的代码的更好的替代方法是什么?

Item* Inventory::add(const string& name) 
{ 
    Item* item = new Item(name); 
    ...(some other code here)... 
    return item; 
} 

谢谢!

+0

怎么样'的std ::的unique_ptr '? –

+0

我不明白为什么这是一个问题。您已经将唯一指向_item_的指针副本返回给客户端 - 现在客户端的工作是将其分配给客户端。只需在合同/文件/意见中明确说明这一事实。 – DaoWen

回答

0

您可能会认为一旦它超出循环,所有内容都将被销毁,但返回的指针(和指向的内存)将保留。它被转移到调用此方法的对象,并且没有内存泄漏。

+0

谢谢。请允许我补充一件事:我没有客户端的代码部分,所以我无法从那里取消分配项目。是否有另一种方法来避免内存泄漏? – user2476826

+0

这确实取决于您的代码部分的范围和可见性。在我看到的生产代码的一个例子中,有一些由一个全局主管理器类处理的“管理器”类。用户必须创建指向主管理器类的指针。然后,当用户需要其中一个“manager”类时,他们可以像往常一样调用'new'来获取指针,但不应该自己释放这些指针;它们只需要调用主管理器指针的'delete',并且它将反过来释放所有现有的管理器类。 – Neoh