首页
社区
课程
招聘
[旧帖] [求助]C++异常。看了几本书,都没看懂。c++高手来帮忙看下 0.00雪花
发表于: 2014-7-13 20:33 1207

[旧帖] [求助]C++异常。看了几本书,都没看懂。c++高手来帮忙看下 0.00雪花

2014-7-13 20:33
1207
class errir
{
public:
        errir()
        {
                p = new int;
                *p= 50;
        }
        //errir(const errir &e)
        //{
        //        p = new int;
        //        *p = 100;
        //}
         ~errir()
        {
                delete p;
        }
        int *p ;
};

int _tmain(int argc, _TCHAR* argv[])
{
        try
        {
                throw errir();
        }

        catch (errir &e)
        {
                cout<< *(e.p)<<endl;
        }
        system("pause");
        return 0;
}
//上面执行错误。析构函数 执行两次。 看反汇编,throw后直接 运行了 析构
1.把 上面注释去掉。执行正确。看反汇编,throw后直接 运行 cath
2.把 析构改成 虚析构,也正确。。

看了 几本书的 异常。。都没有 说这个原因。。各位大牛  能不能给分析下呢。。谢谢了。。VS2010

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 1443
活跃值: (96)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
throw会通过调用拷贝构造函数来构造临时对象,假设你在func中调用了throw errir(),那这个errir对象就是func的局部变量,怎么把它返回给调用者呢?显然需要将它拷贝到一个安全的地方,其实你catch到的已经是拷贝构造的另一个errir对象了。
你的这个例子中,如果errir没有一个合适的拷贝构造函数,就会delete指针p两次。
另外,改成虚析构也是错的。
2014-7-14 00:39
0
雪    币: 5
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
首先谢谢您的回答
1.我用的是引用。不应该有临时对象。但 thorw后 ,的确调用了
2.改虚析构。。我用VS2010调用时正确的啊。。没有 调用 临时对象。不知道 您用的什么什么编译器
2014-7-15 22:49
0
游客
登录 | 注册 方可回帖
返回
//