尝试{}赶上(){} C++
我有以下方法:尝试{}赶上(){} 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
之前删除指针c
从MyClass:
对象?
什么:
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
,则应该使用智能指针建议来遵循其他答案。
你应该使用某种形式的RAII,所以你不必为自己删除对象而烦恼。
使用RAII,对象本身负责释放它所获取的资源,而且您不必亲自去做。
实施RAII的最简单方法之一是使用Smart pointers。您可以使用unique_ptr。
我很确定这是中文的OP –
@yi_H:我在回答中链接了*什么是RAII?*问题,这更详细地解释了这个问题。 –
当然,在这种情况下,最好只是堆叠分配“MyClass”的实例。 – Mankarse
简单的答案是,您应该使用智能指针来管理内存(智能指针的选择取决于其余代码),这将简化您的代码。实际上,您必须在退出上下文的所有代码路径中使用delete
,其中包括两个返回值以及可能引发的任何其他异常。
std::auto_ptr<MyClass> c(new MyClass);
'std :: unique_ptr'在这种情况下更合适,因为'c'不会去任何地方。使用'unique_ptr'可以更清楚地说明代码的意图,并且可能会更有效。 – Mankarse
有时我觉得我应该减少每个答案,没有任何其他解释或规则,或对问题的完整知识跳入'shared_ptr'。 'shared_ptr'是语言中限制性最强的智能指针之一,一旦它声明资源的所有权,它就不能产生它,这意味着如果'code'将指针的所有权传递给另一个函数''shared_ptr'将仍然会删除它,否则你将被迫(如果可以的话)改变另一个函数的接口...... @Mankarse是正确的:'unique_ptr'或甚至是旧的'auto_ptr'都是更好的默认选择。 –
@DavidRodríguez - 我使用shared_ptr与旧编译器兼容 - 并非所有编译器都支持C++ 0x。在这个问题的背景下,所有权没有问题。对于C++ 0x unique_ptr是答案。 –
你可以在try和catch之外创建一个变量,默认设置为false,而不是返回true。而不是返回false返回变量。
然后您可以在返回该变量之前删除您的实例。
究竟在哪里?最好是在myClass里面创建实例?你能发表你的想法吗?thx – sunset
这个问题没有任何意义。请澄清为什么你创建对象'C'。它的一生如何?你需要一个指针吗? –
另外,更正发布的代码,当前的代码没有意义:类范围中的'MyClass;'没有意义,在类定义之后缺少';',你的语义打算做不明确... –
可能重复[如何释放内存在try-catch块?](http://stackoverflow.com/questions/3048377/how-to-free-memory-in-try- catch-blocks) – razlebe