C++ 试试{}catch(){}c++;
我有以下方法:C++ 试试{}catch(){}c++;,c++,try-catch,C++,Try Catch,我有以下方法: class MyClass { public: MyClass; bool method (MyClass &obj); }; void MyClass::method (MyClass &obj) { MyClass *c = new MyClass; try{ //code //access another method return true; } ca
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
之前,我应该在哪里从MyClass:
删除指向对象的指针c
您应该使用某种形式的,这样您就不必费心自己删除对象了
使用RAII,对象本身负责释放它所获得的资源,而您不必自己去做
实现RAII的最简单方法之一是使用您可以使用unique\u ptr您应该使用某种形式的,这样您就不必亲自删除对象 使用RAII,对象本身负责释放它所获得的资源,而您不必自己去做 实现RAII的最简单方法之一是使用
您可以使用unique\u ptr简单的答案是您应该使用智能指针来管理内存(智能指针的选择取决于代码的其余部分),这将简化您的代码。实际上,您必须在退出上下文的所有代码路径中删除它,其中包括两个返回和可能引发的任何其他异常。简单的答案是,您应该使用智能指针来管理内存(智能指针的选择取决于代码的其余部分),这将简化您的代码。实际上,您必须在退出上下文的所有代码路径中删除它,其中包括两个返回和可能引发的任何其他异常 std::auto_ptr<MyClass> c(new MyClass); std::自动测试c(新MyClass); std::自动测试c(新MyClass);
您可以在try-and-catch外部创建一个变量,在默认情况下将其设置为false,而不是返回true并为其分配true。并返回变量,而不是返回false
然后,您可以在返回该变量之前删除实例。您可以在try-and-catch之外创建一个变量,默认情况下将其设置为false,而不是返回true并为其分配true。并返回变量,而不是返回false 然后,您可以在返回该变量之前删除实例。关于:
void MyClass::method (MyClass &obj)
{
MyClass c;
try{
//code
//access another method
return true;
}
catch (std::string s)
{
}
return false;
}
无新建
->无删除
要求<当method
返回时,code>c将自动销毁。如果您的示例过于简单,并且需要使用new
创建c
,则应遵循其他答案和智能指针建议 那么:
void MyClass::method (MyClass &obj)
{
MyClass c;
try{
//code
//access another method
return true;
}
catch (std::string s)
{
}
return false;
}
无
新建
->无删除
要求<当method
返回时,code>c将自动销毁。如果您的示例过于简单,并且需要使用new
创建c
,则应遵循其他答案和智能指针建议 这个问题毫无意义。请澄清创建对象c
的原因。它的寿命是多少?你需要一个指针吗?另外,纠正发布的代码,当前的代码没有真正意义:MyClass类范围中的code>没有意义,缺少一个代码>在类定义之后,您打算做什么的语义不清楚…这个问题的可能重复没有任何意义。请澄清创建对象c
的原因。它的寿命是多少?你需要一个指针吗?另外,纠正发布的代码,当前的代码没有真正意义:MyClass类范围中的code>没有意义,缺少一个代码>在类定义之后,你打算做什么的语义还不清楚…我很确定这可能是中文的OP@yi_H:I链接,什么是RAII?答案中的问题详细解释了这一点。当然,在这种情况下,最好只对MyClass
@Mankarse的实例进行堆栈分配:当然,如果不需要动态分配,就不应该使用它。但我认为OP提供示例代码的目的是提供一个最低限度的代码示例来询问他的疑问&这不是他/她正在使用的实际代码。@yiuh,如果OP是中文的呢?我很确定这是中文的OP@yi_H:I链接,什么是RAII?答案中的问题详细解释了这一点。当然,在这种情况下,最好只对MyClass
@Mankarse的实例进行堆栈分配:当然,如果不需要动态分配,就不应该使用它。但我认为OP提供该示例代码的目的是提供一个最低限度的代码示例来询问他的疑问&这不是他/她正在使用的实际代码。@yi_H,如果OP是中文的呢?std::unique\u ptr
在这种情况下更合适,因为c
没有任何作用。使用unique\u ptr
可以更清楚地说明代码的意图,并且可能会更有效。有时我觉得我应该在没有任何其他解释或规则的情况下,或者在不完全了解问题的情况下,对每个答案投下否决票,然后跳转到共享\u ptr
shared_ptr
是语言中限制最严格的智能指针之一,一旦它声明了资源的所有权,它就不能产生它,这意味着如果//code
将指针的所有权传递给另一个函数,那么shared_ptr
仍将删除它,或者您将被迫(如果可以的话)要更改另一个函数的接口@MARKARSE是正确的:<代码> UnQuyPPTR <代码>,甚至好的旧代码> AutoPPTR <代码>是更好的默认选择。@戴维RoDr.Guez——我使用SysDypPTR来兼容旧编译器——并非所有编译器都支持C++0X。在这个问题的背景下,所有权没有问题。对于C++ 0x UNIQUYYPTR是