new和delete运算符

运算符new的使用如下所示:

int *pi = new int(5);
但事实上它是由两个步骤完成的:

1.配置内存:

//调用函数库中的new运算符

int *pi =  __new (sizeof(int));

2.将配置得来的对象设置初值

*pi = 5 ;

更进一步地说,初始化操作应该在内存配置成功后才执行:

int *pi ;
if( pi = __new (sizeof (int) ))
    *pi = 5 ;//成功才初始化

delete运算符的情况类似。当程序员写下:

delete pi ;

时,如果pi的值是0,C++语言会要求delete运算符不要有操作。因此编译器必须为此调用构造一层保护膜:

if( pi !=0)
   __delete( pi);
请注意pi并不会因此被自动清为0,因此像这样的后继行为:

if( pi && *pi = 5).....

虽然没有良好的定义,但是可能被评估为真。这是因为对于pi所指向的内存变更或再使用,可能会发生。

pi所指的对象的生命会delete而结束,虽然pi所指的地址上的对象不再合法,地址本身却仍然代表一个合法的程序空间。因此pi能够继续使用,但是只能在受限的情况下,很像一个void* 指针的情况。

以constructor来配置一个class object,情况类似。例如:

Point3d *origin  = new Point3d ;

被转换为:

Point3d *origin ;
if( origin = __new (sizeof(Point3d) ))
     origin = Point3d::Point3d(origin)
destructor如下所示:

delete origin;

会转换成:

      if( origin != 0 ){
		Point3d::~Point3d(origin);
		__delete(origin);
	}

new 运算符实际上总是以标准的C malloc完成,虽然并没有规定一定得这么做不可,相同情况,delete运算符也总是以标准的C free完成的。

        extern void
	operator delete(void *ptr)
	{
		if( ptr)
		    free(ptr);
	}


Placement Operator new的语意

有一个预定义好的重载(overload)new 运算符,称为placement operator new,它需要第二个参数,类型为void*。调用方式如下:

Point2w *ptw = new (arena) Point2w;

其中arena指向内存中一个区块,用以放置新产生的Point2w object。这个预先定义好的placement operator new的实现方法简直是出乎意料之外。它只是将“获得的指针”所指的地址传回即可。

void *
operator new(size_t,void*p)
{
  return p;
}
Placement Operator new 所扩充的另一半是将Point2w constructor自动实施于arena所指的地址上:

Point2w *ptw = (Point2w*) arena ;
if( ptw !=0)
   ptw->Point2w::Point2w();

这就决定了新生产的object被放置在哪里,编译系统保证object的constructor会施行于其上。

如果placement operator在原来存在的一个object上构造新的object,而该既存在的object有个destructor,这个destructor并不会调用。因为调用delete函数,该空间没有被保留。而应该这样使用:

ptw->~Point2w;
ptw = new (arena) Point2w;
    注意:Point2w object 所需要的空间需要小于或者等于arena所指的地址的空间;




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值