深度探索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);

}

 

转载于:https://www.cnblogs.com/liuyubin233/p/6672441.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值