从函数中抛出内部对象异常是合法的

时间:2014-09-01 18:30:20

标签: c++

从这样的函数中抛出异常是违法的吗?
在Eclipse中它可以工作......
这是真的吗?我们可以抛出内部对象来抛出异常吗?

class Bad {
    int i;
public:
    void what() { cout << "exp" << i; }
};

class A {
public:
    void f() {
        Bad e;
        throw e;
    } // e are deleted by d'tor?
};

int main() {
    A a;
    try {
        a.f();
    } catch (Bad& e) // What happen here? we catch reference to some object that
                     // was deleted by Bad dt'or
    {
        cout << "in catch";
        e.what(); // what happen here?
    }
    return 0;
}

1 个答案:

答案 0 :(得分:3)

你的代码很好。 throw e;制作e的副本,在处理异常后将其销毁。处理程序被赋予对该副本的引用。

如果你扔了一个指向局部变量的指针,你可能会遇到麻烦;在处理异常之前,变量将被销毁,使指针无效。但扔任何指针在任何情况下都是一件奇怪的事情。