gpt4 book ai didi

c++ - 通过引用抛出异常对象好不好

转载 作者:行者123 更新时间:2023-11-28 02:02:22 25 4
gpt4 key购买 nike

嗯,我一直在读this一篇关于避免异常处理错误的文章,看起来不错,但我坚持要澄清的一点是,话虽这么说

When an exception is thrown and control passes from a try block to a handler, the C++ run time calls destructors for all automatic objects constructed since the beginning of the try block.

还有一点,它似乎表明在 catch 中通过引用抛出对象是一种很好的做法,因为它避免了内存管理和复制,对我来说似乎很奇怪的是

try
{

Object o;
//make error..
throw ref(o);
}catch(Object & p)
{
//do some handle..
}

和上面说的相比,用上面的代码好吗?在 try 中构造的所有对象在到达 throw 时不是都展开了......还是在 catch 之后展开?

最佳答案

Is it good to throw an exception object by reference?

没有。它不是。在您的示例中, o 将在抛出后作为堆栈展开的一部分被销毁,因此您将捕获一个悬空引用。

按照文章所说的做并按值抛出:throw o;, throw std::move(o);(如果 o 是cheap-to-move-hard-to-copy ) 或在单独的函数中移动异常调整并执行类似 throw make_error(/*...*/) 的操作。这将抛出对象 o 的拷贝,它具有独立的生命周期,并且在处理之前不会被堆栈展开销毁。

您应该通过引用捕获异常(catch Object& o)以避免异常对象的额外拷贝和潜在的切片。

所以你应该按值抛出对象(避免生命周期问题)并按引用捕获(避免切片和额外复制)

关于c++ - 通过引用抛出异常对象好不好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38934827/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com