深度探索C++对象模型笔记(1)——new和delete运算符

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);

}

 

posted on 2017-04-06 10:52  nclyb  阅读(220)  评论(0)    收藏  举报

导航