【发布时间】:2011-03-20 09:10:28
【问题描述】:
我在堆栈上有一个对象,我希望它的析构函数在调用析构函数时跳过一些工作,因为堆栈正在展开,因为通过堆栈上对象的范围抛出特定异常。
现在我可以在堆栈项的范围内添加一个 try catch 块并捕获有问题的异常并通知堆栈对象不要运行要跳过的工作,然后重新抛出异常,如下所示:
RAII_Class pending;
try {
doSomeWorkThatMayThrowException();
} catch (exceptionToSkipPendingDtor &err) {
pending.notifySkipResourceRelease();
throw;
}
但是,我希望有一种更优雅的方式来做到这一点。例如想象:
RAII_Class::~RAII_Class {
if (detectExceptionToSkipPendingDtorBeingThrown()) {
return;
}
releaseResource();
}
【问题讨论】:
-
我立即想到的问题是:你是如何让自己陷入析构函数“认为”它拥有资源但不应该释放它的情况?这对我来说似乎很可疑。我想摆脱这个困境的更好方法是追溯你进入它的方式并采取其他路线。
-
这种情况出现在客户端服务器架构的情况下,其中连接被抛出异常重置并且尝试释放资源需要与另一方交谈,并且由于重新连接导致另一个会干扰的故障随着重新连接。
-
(您需要正确地@address 评论答案才能显示在我们的答案列表中。我只是不小心偶然发现了这个。)我立即想到解决这个问题的一种方法是让那个 RAII 类使用一些函数来释放资源由 RAII 类的析构函数。
标签: c++ exception destructor raii