13.5.4 构造函数调用

分析下面语句:

13.5.4 构造函数调用 - 图1

调用new分配了一个大小等于MyType类型的内存,然后在那个内存上调用了MyType构造函数。但如果使用了new的内存分配没有成功,将会出现什么状况呢?在那种情况下,构造函数不会被调用,所以虽然没能成功地创建对象,但至少没有调用构造函数并传给它一个为0的this指针。下面的例子说明了这一点:

13.5.4 构造函数调用 - 图2

当程序运行时,并没有打印出构造函数的信息,仅仅是打印了operator new()和异常处理的信息。因为new没有返回,构造函数也没有被调用,当然它的信息就不会被打印出来。nm被初始化为0是很重要的,因为new表达式没有执行完毕,指针被置为0可以确保我们没有误用它。但是,在异常处理中,我们除了打印出一条信息以外,还应当多做一些事情,使得程序继续执行,就像该对象已经被成功地创建了一样。理想情况下,我们所做的将使程序从问题中恢复过来,或者至少可以在记录下错误后退出。

在以前的C++版本中,如果内存分配失败,则一般是返回0。它将使构造函数不被调用。但是,如果试着在一个标准的编译器中由new返回0值,则会被告之应该产生一个bad_alloc。