int *pi = new int(5);
new操作实际上由两步组成:
(1)通过适当的new运算符函数实体,配置所需的内存。
调用函数库中的new运算符。
int *pi = new = __new( sizeof( int ) );
(2)给配置得来的对象设立初值。
*p = 5;
初始化应该在内存配置成功(经由new运算符)后才执行。
1 int *pi; 2 3 if( pi = __new( sizeof(int) ) ) 4 5 *pi = 5; //分两步
类似地;
delete pi; if( pi != 0) __delete( pi );
注意pi并不会自动被清0(NULL)。
所以后面如果有如下操作:
if( pi && *pi = 5 ) { //......... }
将是合法的(但无法预测后果的)。
delete会结束pi指向的对象的生命,所以后面不应该再去处理这部分内存。
当new操作的是一个类时:
Point3d *origin = new Point3d;
被转换为:
Point3d *origin; //伪码 if(origin = __new ( sizeof( Point3d ) ) ) origin = Point3d::Point3d( origin );
(1)申请内存。
(2)调用构造函数。
类似地:delete
delete origin; 会变成: if( origin != 0) { //伪码 Point3d::~Point3d( origin ); __delete( origin ); }
注意,语言要求每一次new调用都必须传回一个独一无二的指针,即使是以下代码,也会传回一个指针,指向一个默认为1-byte的内存块。
new T[0]; new运算符实际上以标准的C malloc() 完成,delete也是以标准的C free()函数完成,但不是一定要这样。 extern void operator delete(void *ptr) { if( ptr ) free((char*)ptr); }