13.1.2 operator new

C++中的解决方案是把创建一个对象所需的所有动作都结合在一个称为new的运算符里。当用new(new的表达式)创建一个对象时,它就在堆里为对象分配内存并为这块内存调用构造函数。因此,如果写出下面的表达式:

13.1.2 operator new - 图1

在运行时等价于调用malloc(sizeof(MyType))(常常,就是精确地调用malloc()),并使用(1,2)作为参数表来为MyType调用构造函数,this指针指向返回值的地址。在指针被赋给fp之前,它是不定的、初始化的对象—在这之前我们甚至不能触及它。它自动地被赋予正确的MyType类型,所以不必进行映射。

默认的new还进行检查以确信在传递地址给构造函数之前内存分配是成功的,所以不必显式地确定调用是否成功。在本章后面,我们将会发现,如果没有可供分配的内存会发生什么事情。

我们可以为类使用任何可用的构造函数而写一个new表达式。如果构造函数没有参数,可以写没有构造函数参数表的new表达式:

13.1.2 operator new - 图2

我们已经注意到了,在堆里创建对象的过程变得简单了—只是一个简单的表达式,它带有内置的长度计算、类型转换和安全检查。这样在堆里创建一个对象和在栈里创建一个对象一样容易。