8.了解各种不同意义的new和delete

new operator和 operator new的区别
   通常我们使用的new是new operator。不能改变其意义。new operator做两件事。1、分配足够放置对象的内存。2、调用一个constructor,为刚才分配的内存中那个对象设定初值。
   operator new的声明如下: void *operator new(size_t size); 我们可以重载这个new。而这个函数所做的事是执行必要的内存分配动作。
   简单的说就是new operator在第一步调用operator new,而后第二步调用constructor。

例如:string *ps = new string("ha ha");
则产生的行为如下:
     void *memory = operator new(sizeof(string));
     call string::string("ha ha");
     static_cast<string *>(memory);

Placement new
   对已经分配好的内存中构造对象。
   Widget *ConstructWidgeInBuffer(void *buffer, int widgetSize)
{
     return new (buffer) Widget(widgetSize);   //在buffer这块内存中构造对象
}

删除与内存释放
   string *ps;  delete ps;
会造成编译器产生近似这样的代码:
  ps->~string();   
  operator delete(ps);

  void *buffer  = operator new(50*sizeof(char));
  ...    operator delete(buffer);
这组行为相当于调用malloc和free。

数组
   string *ps = new string[10];
新版的编译器会加入operator new[]这一特性,主要是因为operator new只会调用一次constructor,new []会为每一个对象调用constructor。

总结
    new operator和delete operator都是内建操作符,无法为你所控制,但可以定制内存分配\释放函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值