今天天遇到这样一个问题,连续两次抛出异常,但是只有一个catch,会导致core这个时候会导致core,
单线程编程中可能很少遇到这样的问题,但是多线程中是很容易遇到的,
举个例子:catch代码在主线程M中,子线程C1抛出异常,如果引起子线程C2的终止,在C2终止的过程中也产生异常,那就出问题了。
下面贴一个测试案例
#include <iostream>
#include <string>
#include <boost/shared_ptr.hpp>
#include <exception>
class Exception
{
public:
Exception(const std::string& msg)
:_message(msg)
{
}
const std::string& what()
{
return _message ;
}
private:
std::string _message ;
};
class B {
public:
B()
{
_ch = new char('h') ;
std::cout << "B()" << std::endl;
}
~B()
{
delete _ch ;
std::cout << "~B()" << std::endl;
}
void visit()
{
std::cout << *_ch << ",first" << std::endl;
throw Exception("Exception - huangxiaowei");
std::cout << *_ch << ",second" << std::endl;
}
public:
char* _ch ;
};
class A {
public:
B b;
public:
A():
b()
{
std::cout << "A()" << std::endl;
}
~A()
{
std::cout << "~A()" << std::endl;
b.visit();
}
void get()
{
b.visit();
}
};
int main() {
try
{
//boost::shared_ptr<A> spa(new A());
//spa->get();
A a ;
a.get();
}
catch(Exception& e)
{
std::cout << e.what() << std::endl;
}
}
这是一个很巧妙的例子
调用get的时候 B方法visit抛出异常,这个时候A要析构,又一次调用B的visit再次抛出异常,
导致程序core掉
这其中的原理没有深入研究