Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 试试{}catch(){}c++;_C++_Try Catch - Fatal编程技术网

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没有意义,缺少一个
在类定义之后,您打算做什么的语义不清楚…这个问题的可能重复没有任何意义。请澄清创建对象
c
的原因。它的寿命是多少?你需要一个指针吗?另外,纠正发布的代码,当前的代码没有真正意义:MyClass没有意义,缺少一个
在类定义之后,你打算做什么的语义还不清楚…我很确定这可能是中文的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是