2011-08-29 190 views
1

我有以下方法:尝试{}赶上(){} C++

class MyClass 
{ 
public: 
    MyClass; 

    bool method (MyClass &obj); 
}; 

void MyClass::method (MyClass &obj) 
{ 
    MyClass *c = new MyClass; 
    try{ 
     //code 
     //access another method 
     return true; 
    } 
    catch (std::string s) 
    { 
    } 
    return false; 
} 

我应该在哪里return true之前或return false之前删除指针cMyClass:对象?

+2

这个问题没有任何意义。请澄清为什么你创建对象'C'。它的一生如何?你需要一个指针吗? –

+0

另外,更正发布的代码,当前的代码没有意义:类范围中的'MyClass;'没有意义,在类定义之后缺少';',你的语义打算做不明确... –

+0

可能重复[如何释放内存在try-catch块?](http://stackoverflow.com/questions/3048377/how-to-free-memory-in-try- catch-blocks) – razlebe

回答

10

什么:

void MyClass::method (MyClass &obj) 
{ 
    MyClass c; 
    try{ 

     //code 
     //access another method 
     return true; 
    } 
    catch (std::string s) 
    { 
    } 
    return false; 
} 

没有new - >无delete需要。当method返回时,c会自动销毁。如果您的示例过于简化并且您需要使用new创建c,则应该使用智能指针建议来遵循其他答案。

9

你应该使用某种形式的RAII,所以你不必为自己删除对象而烦恼。

使用RAII,对象本身负责释放它所获取的资源,而且您不必亲自去做。

实施RAII的最简单方法之一是使用Smart pointers。您可以使用unique_ptr

+4

我很确定这是中文的OP –

+0

@yi_H:我在回答中链接了*什么是RAII?*问题,这更详细地解释了这个问题。 –

+2

当然,在这种情况下,最好只是堆叠分配“MyClass”的实例。 – Mankarse

3

简单的答案是,您应该使用智能指针来管理内存(智能指针的选择取决于其余代码),这将简化您的代码。实际上,您必须在退出上下文的所有代码路径中使用delete,其中包括两个返回值以及可能引发的任何其他异常。

3
 
std::auto_ptr<MyClass> c(new MyClass); 
+2

'std :: unique_ptr'在这种情况下更合适,因为'c'不会去任何地方。使用'unique_ptr'可以更清楚地说明代码的意图,并且可能会更有效。 – Mankarse

+1

有时我觉得我应该减少每个答案,没有任何其他解释或规则,或对问题的完整知识跳入'shared_ptr'。 'shared_ptr'是语言中限制性最强的智能指针之一,一旦它声明资源的所有权,它就不能产生它,这意味着如果'code'将指针的所有权传递给另一个函数''shared_ptr'将仍然会删除它,否则你将被迫(如果可以的话)改变另一个函数的接口...... @Mankarse是正确的:'unique_ptr'或甚至是旧的'auto_ptr'都是更好的默认选择。 –

+0

@DavidRodríguez - 我使用shared_ptr与旧编译器兼容 - 并非所有编译器都支持C++ 0x。在这个问题的背景下,所有权没有问题。对于C++ 0x unique_ptr是答案。 –

0

你可以在try和catch之外创建一个变量,默认设置为false,而不是返回true。而不是返回false返回变量。

然后您可以在返回该变量之前删除您的实例。

+0

究竟在哪里?最好是在myClass里面创建实例?你能发表你的想法吗?thx – sunset