C++ - 抛出和捕获异常的正确方法

Kev*_*vin 8 c++ memory-leaks exception-handling exception

可能重复:
在堆栈上抛出对象的异常,用新的mem泄漏?

没有new运算符的情况下,您是否在C++中抛出异常?因为这两个都会引发异常.

void KillUnicorns()
{
    throw IllegalActionException();
}

int main()
{
    try
    {
        KillUnicorns();
    }
    catch (IllegalActionException e)
    {
         // Handle exception
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

虽然以下示例会泄漏内存?

void KillUnicorns()
{
    throw new IllegalActionException();
}

int main()
{
    try
    {
        KillUnicorns();
    }
    catch (IllegalActionException* e)
    {
         // Handle exception
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在C++中抛出异常的正确方法是什么?

Naw*_*waz 9

我会抛出异常而不使用new:

void KillUnicorns()
{
    throw IllegalActionException();
}
Run Code Online (Sandbox Code Playgroud)

catch它会const参考,如:

catch (const IllegalActionException & e)
{   // ^^^^ note const             ^^ note reference!

}
Run Code Online (Sandbox Code Playgroud)

它避免了复制.它避免了new,因此可以避免使用delete.

  • @Kevin:在一个类型中添加前缀或postfing cosnt是一个风格问题(你可以看到两者).结果是一样的. (2认同)

Mar*_*ork 8

从技术上讲,你可以做到.

但抛出对象更传统:
还要注意通过const引用捕获(这可以防止切片异常)

try
{
    KillUnicorns();
}
catch (IllegalActionException const& e)
{                         // ^^^^^^^^
     // Handle exception
}
Run Code Online (Sandbox Code Playgroud)

  • +1.只是要添加,通常会为异常对象留出内存.如果你进行动态分配,那么你正在使用那个内存作为指针,但仍然在尝试沼泽标准的动态分配(如果你的实现使用了一个,则在"堆"上).如果异常的原因是你内存不足,那就......不太好.当然,你为自己创造了一个混乱,以后可以释放那些记忆. (5认同)