一个构造函数抛异常的问题

mandysss 2010-01-11 12:48:17
class A
{
int key;
A(int n):key(n)
{
init();
}
void init()
{
//some code
throw AException();
}
};

A* a = NULL;
a = new A(3);


在init的时候抛出异常来,A被析构掉,但此时a已经不是NULL了。
...全文
257 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
mandysss 2010-01-11
  • 打赏
  • 举报
回复
可能我没写清楚,整个构造还没完成,为什么a已经被赋值了?不是等new A(3)全部执行后才赋值吗
lovesi3344 2010-01-11
  • 打赏
  • 举报
回复
我们老师说过:构造函数抛出异常,表明构造函数没有执行完。所以最好不要让构造函数抛出异常。

菜鸟路过
IT_lau 2010-01-11
  • 打赏
  • 举报
回复
xx
Qlaiaqu 2010-01-11
  • 打赏
  • 举报
回复
a并没有被析构啊,抛出了异常,只要处理了异常程序就不会结束,初始化也不会有问题吧。
星光伴月 2010-01-11
  • 打赏
  • 举报
回复
是的,在类的构造函数里抛出异常将导致类的析构函数不被执行。
代码应该这样写:
A* a = NULL;
try{
a = new A(3);
}
catch(...)
{
a = NULL;
}
macrojj 2010-01-11
  • 打赏
  • 举报
回复
你没有把它置为null 当然就不是null了
就算人家构造了一半,也不是null了嘛
itegel84 2010-01-11
  • 打赏
  • 举报
回复
试了一下,如果构造函数报了异常,那么a还是NULL,根本就没有构造成功。因此抛异常是在构造之前,对象构造应该是构造函数执行完成后才算真正结束。


#include <iostream>
using namespace std;

class A
{
public:
int key;
A(int n):key(n)
{
init();
}
void init()
{
//some code
throw "error!";//构造函数中抛出异常,用于构造失败场景,如果构造函数抛出了异常就不应该使用该对象。
}
};

int main()
{
A* a = NULL;

//如果不处理异常,运行时会有错误
try
{
a = new A(3);
}
catch (...)
{
cout<<"catch exception!"<<endl;
}

a->key = 2;//运行时报错,此时a还是等于NULL
cout<<a->key<<endl;
}
mandysss 2010-01-11
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 yshuise 的回复:]
实际上这些都是些毫无意义的问题:
如果在构造函数抛出异常,说明这个对象没有构造成功。
如果一个对象没有构造成功,而使用它,这是程序员的责任。
异常的两大保证:
内存不要泄露;
程序的状态不被改变。
[/Quote]

这是程序员的问题,只是用这种问题来探讨一下某些比较奇怪的问题。
yshuise 2010-01-11
  • 打赏
  • 举报
回复
实际上这些都是些毫无意义的问题:
如果在构造函数抛出异常,说明这个对象没有构造成功。
如果一个对象没有构造成功,而使用它,这是程序员的责任。
异常的两大保证:
内存不要泄露;
程序的状态不被改变。
yshuise 2010-01-11
  • 打赏
  • 举报
回复
如果在init中抛出异常,那么就不会执行key =n;
这样程序的状态没有被改变。
yshuise 2010-01-11
  • 打赏
  • 举报
回复
很简单:
A(int n)
{
init();
key = n;
}
void init()
{
//some code
throw AException();
}
mandysss 2010-01-11
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 ysuliu 的回复:]
你怎么知道现在a不是NULL了?
你可以单步跟一下,a肯定还是NULL的。。

GCC是这样,但不保证其它编译器也是这样。。
[/Quote]

我就是跟了才这么说的,在symbian的GCCE编译器下这个不为NULL了。为了这个问题,还浪费了好多时间
ysuliu 2010-01-11
  • 打赏
  • 举报
回复
你怎么知道现在a不是NULL了?
你可以单步跟一下,a肯定还是NULL的。。

GCC是这样,但不保证其它编译器也是这样。。
tan870426 2010-01-11
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 mandysss 的回复:]
可能我没写清楚,整个构造还没完成,为什么a已经被赋值了?不是等new A(3)全部执行后才赋值吗

[/Quote]
应该是在抛异常前面的//some code 干的吧?
taodm 2010-01-11
  • 打赏
  • 举报
回复
有这个规定吗?真有这个规定吗?
[Quote=引用 5 楼 mandysss 的回复:]
可能我没写清楚,整个构造还没完成,为什么a已经被赋值了?不是等new A(3)全部执行后才赋值吗

[/Quote]

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧