gpt4 book ai didi

c++ - 如何通过引用捕获异常来解决局部变量问题

转载 作者:行者123 更新时间:2023-11-30 01:55:39 25 4
gpt4 key购买 nike

在更有效的 c++ 项目编号 -13 中,项目 13:通过引用捕获异常。

还有一点要说——要通过指向工作的指针捕获异常,程序员必须以一种方式定义异常对象,以保证该对象在控制离开函数后仍然存在。全局和静态对象工作正常。

//通过指针捕获异常的例子

class exception { ... };          // from the standard C++

void someFunction()
{
static exception ex; // exception object
...
throw &ex; // throw a pointer to ex
...
}
void doSomething()
{
try
{
someFunction(); // may throw an exception*
}

catch (exception *ex)
{ // catches the exception*;
... // no object is copied
}
}

我的疑问是在通过引用捕获异常的情况下它有何不同?如果它是一个局部变量(不是静态的或全局的),那么一旦控制离开函数,对象就不存在了。那么问题是如何通过引用捕获异常来解决的呢?

最佳答案

要捕获一个指针,你必须抛出一个指针。要捕获引用,您可以按值 抛出一个对象。给定对象名称的 throw 表达式会复制该对象;它不会将其参数解释为引用。

抛出的拷贝称为异常对象,它位于由运行时库维护的特殊分配区域中。它的析构函数在异常传播完成时被调用,这可能在调用堆栈的任何位置。 C++11 提供了额外的工具来使用引用计数语义手动控制异常对象的生命周期。

如果按值捕获,则在进入按值捕获的 catch block 时会生成另一个拷贝,而当离开该 catch block 时,第二个拷贝甚至会被销毁如果异常传播到另一个封闭的 catch block 。外部 catch 将看到原始异常对象,内部 catch 没有应用任何修改。

catch block 通信的能力是通过 non-const reference catching 的习语实现的。


顺便说一下,throw by pointer 从根本上被破坏了,因为它无法处理内存不足的错误。如果您尝试使用 new 分配异常对象但没有更多内存,则 std::bad_alloc 将在程序到达 throw< 之前劫持程序 表达式。该库提供了一种分配异常的替代方法,以应对内存不足的情况。

关于c++ - 如何通过引用捕获异常来解决局部变量问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20537484/

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