回 帖 发 新 帖 刷新版面

主题:求教VC++异常处理问题


请看以下代码

#include <iostream>
using namespace std;

class A
{
public:
    A(){cout<<"ctor or A"<<endl;};
    ~A(){cout<<"dtor or A"<<endl;};
};

void f()
{
    A a;
    throw 5;
}

int main()
{
    f();
    return 0;
}

以上代码在VC++6中运行,发现a的析构函数未被调用,如果把main改成这样:

int main()
{
    try
    {
        f();
    }
    catch(...)
    {
    }
    return 0;
}
a就会被析构。

按Effective C++的说法,只在违反异常规范的throw才不会释构对象,程序直接退出。上述函数都未声明异常规范,即允许抛出任何异常,为何非得要捕获异常才能析构a?

谢谢

回复列表 (共3个回复)

沙发

“只在违反异常规范的throw才不会释构对象” --- 指的是正常行为,而你抛出异常,却不捕获异常是一种错误行为。

板凳


就算我不捕获异常,让程序终止,也不能遗留一些对象不析构呀

而且让异常使程序终止有时也是一种正常的使用方法。

3 楼

"异常使程序终止"不是说抛出异常不捕获让程序直接终止……你用的是容易内存泄露的c++不是perl

我来回复

您尚未登录,请登录后再回复。点此登录或注册