天天看點

不同含義的new delete

new\delete

1、new oprator要完成的兩部分

<1>配置設定記憶體,有oprator new 來做

<2> 調用構造函數初始化記憶體中的對象

2、oprator new

作用;傳回未處理的指針和未初始化的記憶體

原型 :void * operator new(size_t size);

重載全局的oprator new
<1>
void* operator new(size_t size)
{
   printf("global newn");
   return malloc(size);
}
<2> 調用全局的new
class A
{
public:
   void* operator new(size_t size)
   {
       printf("operator new calledn");
       return ::operator new(size);
   }
};
A* a = new A();      

3、placement new

使用的場景:定制化構造函數,用自己的構造函數來初始化記憶體

作用是在一個已經配置設定好的記憶體中(棧或者堆中)構造一個新的對象

是new oprator的第二步

使用方法如下:

<1>. 緩沖區提前配置設定

可以使用堆的空間,也可以使用棧的空間,是以配置設定方式有如下兩種:

class MyClass {…};
char *buf=new char[N*sizeof(MyClass)+sizeof(int)];或者char buf[N*sizeof(MyClass)+sizeof(int)];      

<2>. 對象的構造

MyClass * pClass=new(buf) MyClass;      

<3>. 對象的銷毀

一旦這個對象使用完畢,你必須顯式的調用類的析構函數進行銷毀對象。但此時記憶體空間不會被釋放,以便其他的對象的構造。

pClass->~MyClass();      
#include <iostream>;
using namespace std;
 
class T {
public:
  T() { cout << "constructor" << endl; }
  ~T() { cout << "destructor" << endl; }
};
 
int main()
{
  const int NUM = 3;
 
  T* p1 = new T[NUM];
  cout << hex << p1 << endl;
  //  delete[] p1;
  delete p1;
 
  T* p2 = new T[NUM];
  cout << p2 << endl;
  delete[] p2;
}      

繼續閱讀