如果在成员中抛出异常,则删除母对象
delete mother object if exception thrown in member
我有以下问题:
如果在一个成员的构造函数内部抛出异常,我想删除一个母对象。我怎么做呢?
下面不是我想要的。只是你有东西可以参考……
#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;
}
}
相关文章:
- 迭代时从向量和内存中删除对象
- C++从对象自己的类中删除对象
- 如何通过对象的类属性删除对象,并返回其对象值?
- 删除对象(具有不同类型)的引用时会发生什么情况?
- 从列表C++中删除对象
- c++ 循环访问对象列表并删除对象
- 从对象本身的容器中删除对象
- 从尝试引用已删除函数的矢量 C++ 中删除对象
- 如何通过指向元组的共享指针删除对象
- 防止通过接口删除对象
- 在 c++ 中从内存中删除对象
- 当对象被删除时,复制被删除对象的对象如何
- 当我使用dynamic_cast并删除对象删除时,析构函数是如何工作的?
- 从内存中删除对象
- 通过C++中的删除方法自行删除对象
- C++ - 析构函数只是释放内存还是实际删除对象
- 如何通过存储在 std::list 中的指针删除对象?
- 如何通过对象参数从指针矢量中删除对象和指针
- 我可以删除对象的右值版本的函数吗?
- 使用对象的索引从矢量中删除对象