new delete全解析

来源:互联网 发布:带海拔的指南针软件 编辑:程序博客网 时间:2024/04/27 06:51

1.  new operator (new操作符)

     1) 分配空间  调用operator new

     2) 调用构造函数

 

     Sample:

     string * ps = new string("Memory");

 

2.  operator new

     完全申明

     void* operator new(size_t size);

     只负责分配内存,不知道有构造函数存在

 

     void* ps = operator new(sizeof(string));

 

 

     void* memory = operator new(sizeof(string));

     call  string::string("Memory");                           // dev不允许直接调用构造函数

     string* ps = static_cast<string*>(memory);

 

3.  placement new

     在一个已经分配完毕的空间中构造对象

   

     void* operator new(size_t , void* location)

     {

          return location;

     }

 

    

      Widget * constructWidgetInBuffer(void *buffer, int widgetSize)
      {
         return new (buffer) Widget(widgetSize);
      }

 

      1)如果想在堆上建立一个对象,应该用new操作符。它既分配内存又为对象调用构造函数。

      2)如果仅仅想分配内存,就应该调用operator new函数;它不会调用构造函数。

      3)如果你想定制自己的在堆对象被建立时的内存分配过程,你应该写你自己的operator new函数,然后使用new操作符,new操作符会调用你定制的operator new.

      4)如果你想在一块已经获得指针的内存里建立一个对象,应该用placement new.

 

4.  delete operation

     1)调用析构函数

     2)调用operator delete释放内存

 

     得delete ps;

 

5.  operator delete

     完全申明

     void operator delete(void* memToBeDeallocated);

 

     new 和 delete应该对应

     operator new和operator delete应该对应

     placement new和 调用析构函数应该对应 (不应该释放内存)

 

6.  new[]

     string* ps = new string[10];

     1)operator new[]被调用,分配数组需要的空间

     2)每个string对象的默认构造函数被调用

 

7.  delete []

     delete [] ps;

     1)调用每个string 对象的析构函数

     2)释放整个数组的空间

 

     new[] 和delete[]必须对应