在我的代码中,我将*this
传递给方法foo(const MyClass& arg)
。 异常在这个foo内部被抛出,但是虽然在堆栈中存在一个语法正确的 try-catch 块,但它既没有被处理(应该在那里发出一条消息)案例),也没有进程崩溃。从调试日志中,我可以看到相关的线程被卡住了,尽管其余的线程仍在继续。
我经历过堆栈展开文档,在某些地方我已经看到函数的参数也被认为是自动变量,并在展开过程中被销毁。这让我想到了一个问题:当我将 this 的const引用(其中有一个相应的 catch 块)传递给一个异常的方法时会发生什么被抛出?是否有可能ref使得调用者对象被破坏,并且即使已经开始堆栈展开,catch块现在也无法访问?
让我添加一些伪代码:
void MyClass0::someFunc(void)
{
try
{
MyClass1 obj1;
obj1.someOtherFunc(*this);
// Some other stuff
}
catch (MyException&)
{
std::cout << "Handling exception...";
// Whatever... This message is not emitted.
}
}
void MyClass1::someOtherFunc(const MyClass0& argObj0)
{
// Some functions that eventually throw an unhandled MyException
}
提前致谢...
修改: 好的,尝试生成一个可执行代码供参考,我相信我几乎回答了我自己的问题。
以下是代码:
#include "sandbox.h"
#include <iostream>
MyClass0::MyClass0(void)
{
std::cout << "\nConstructing MyClass0";
}
MyClass0::~MyClass0(void)
{
std::cout << "\nDestructing MyClass0";
}
void MyClass0::trustIssues(void)
{
std::cout << "\nEntering " << __FUNCTION__;
try
{
MyClass1 myClass1;
myClass1.unwaryFunction(*this);
}
catch (MyException& exc)
{
std::cout << "\nException caught in " << __FUNCTION__;
std::cout << "\nLeaving " << __FUNCTION__ << " from inside catch block.";
return;
}
std::cout << "\nLeaving " << __FUNCTION__;
}
MyClass1::MyClass1(void)
{
std::cout << "\nConstructing MyClass1";
}
MyClass1::~MyClass1(void)
{
std::cout << "\nDestructing MyClass1";
}
void MyClass1::unwaryFunction(MyClass0& argClass0)
{
std::cout << "\nEntering " << __FUNCTION__;
suicidalFunction();
std::cout << "\nLeaving " << __FUNCTION__;
}
void suicidalFunction(void)
{
std::cout << "\nEntering " << __FUNCTION__;
MyException myException;
throw myException;
std::cout << "\nLeaving " << __FUNCTION__;
}
int main(int argc, char* argv[])
{
MyClass0 myClass0;
myClass0.trustIssues();
return 0;
}
输出结果为:
Constructing MyClass0
Entering MyClass0::trustIssues
Constructing MyClass1
Entering MyClass1::unwaryFunction
Entering suicidalFunction
Destructing MyClass1
Exception caught in MyClass0::trustIssues
Leaving MyClass0::trustIssues from inside catch block.
这意味着*this
参数在unwaryFunction
的堆栈展开时不会被破坏。我可能在实际代码中有一些其他错误(因为类似于“异常陷入...”的消息不会被打印)。我会保留这个问题以供将来参考。无论如何,谢谢你的关注。