如果在成员中抛出异常,则删除母对象

时间:2015-09-17 12:54:51

标签: c++ exception destructor

我有以下问题:

如果在其某个成员的构造函数中抛出异常,我想删除一个母对象。 我该怎么做?

以下不是我想要的。只是你有什么可以参考......

#include <iostream>

struct A
{

    A(int i)
    :mem(0)
    {
        try{
            if(i > 9) throw 0;
        }catch(int x) { std::cout << "mem max size 9\n"; return;}
        mem = i;
    }

    int mem;
};

struct B
{
    B(int i)
    :mem(i)
    {
    }

    const A mem;

};

int main()
{

    B b1(2);
    B b2(10);

    std::cout << "b1: " << b1.mem.mem << std::endl;
    std::cout << "b2: " << b2.mem.mem << std::endl;

}

//~ output:
//~ mem max size 9
//~ b1: 2
//~ b2: 0

修改

关注this link我更改了我的代码,如下所示

#include <iostream>

struct A
{

    A(int i)
    :mem(0)
    {
        if(i > 9) throw 0;
        else mem = i;
    }

    int mem;
};

struct B
{
    B(int i)
    try
    :mem(i)
    {
    }
    catch(int e)
    {
        std::cerr << "Error #" << e << std::endl;
    }

    const A mem;
};

int main()
{
    B b1(2);
    B b2(10);
}

//~ output:
//~ Error #0
//~ terminate called after throwing an instance of 'int'
//~ Aborted

但是,我不希望程序中止......我该如何防止这种情况?

如果我这样做,程序不会被中止但是B对象正在被构建,尽管例外......

#include <iostream>

struct A
{

    A(int i)
    :mem(0)
    {
        try
        {
            if(i > 9) throw 0;
        }
        catch(int e)
        {
            std::cerr << "A Error #" << e << std::endl; return;
        }
         mem = i;
    }

    int mem;
};

struct B
{
    B(int i)
    try
    :mem(i)
    {
    }
    catch(int e)
    {
        std::cerr << "Error #" << e << std::endl;
    }

    const A mem;
};

int main()
{

    B b1(2);
    B b2(10);

    std::cout << "b1: " << b1.mem.mem << std::endl;
    std::cout << "b2: " << b2.mem.mem << std::endl;

}

//~ A Error #0
//~ b1: 2
//~ b2: 0

如果我重新投入A中的程序,程序会再次中止......

1 个答案:

答案 0 :(得分:3)

B的构造函数没有获得异常,因为A的构造函数正在捕获它。摆脱那里的try阻止:

A(int i)
:mem(0)
{
    if(i > 9) {
        std::cout << "mem max size 9\n";
        throw 0;
    }
    mem = i;
}

如果你试图在B的初始值设定项列表中捕获异常,它将会被重新抛出,所以不要在那里捕获异常,而是在main中抓住它:

int main()
{
    try {
        B b1(2);
        std::cout << "b1: " << b1.mem.mem << std::endl;
    } catch (int e) {
        std::cout << "failed to create b1" << std::endl;
    }
    try {
        B b2(10);
    } catch (int e) {
        std::cout << "failed to create b2" << std::endl;
    }
}