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

delete mother object if exception thrown in member

本文关键字:删除 对象 抛出异常 成员 如果      更新时间:2023-10-16

我有以下问题:

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

下面不是我想要的。只是你有东西可以参考……

#include <iostream>
struct A
{
    A(int i)
    :mem(0)
    {
        try{
            if(i > 9) throw 0;
        }catch(int x) { std::cout << "mem max size 9n"; 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
<标题>编辑

在此链接之后,我将代码更改如下

#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中重新抛出catch,程序将再次中止…

B的构造函数没有得到异常,因为A的构造函数正在捕获它。去掉那里的try块:

A(int i)
:mem(0)
{
    if(i > 9) {
        std::cout << "mem max size 9n";
        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;
    }
}