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

来源:互联网 发布:阿里云招聘 网络 编辑:程序博客网 时间:2024/06/11 19:34
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都是内建操作符,无法为你所控制,但可以定制内存分配\释放函数。
0 0
原创粉丝点击