1.new 操作符  与   操作符 new 


//new                new操作符

//delete             delete操作符

//operator new       操作符new

//operator delete    操作符delete

void main()

{

           Date *p_date = (Date *)operator new (sizeof (Date));  //只是开辟空间

           new (p_date)Date (1, 1, 1);      //定位  new

          p_date->~Date();               //析构函数的显示调用

           operator delete (p_date);      //空间的释放


           //等价于

           Date *p_date = new Date(1,1,1);

           delete p_date;



           //注意:这里会造成内存泄露

           void* p_date = new Date (1, 1, 1);

           operator delete (p_date);       (相当于free)

           //new 开辟了空间并调用了构造函数,但在析构时,系统只析构了p_date所指向的空间,并没有调用析构函数

           //因为p_date是void类型的指针,系统不知道它是一个对象,所以没调用析构函数

}


2.定位new   //placement new


new(原始指针)类型(初始化参数列表);

注释:在原始空间的指针p 所指的位置 构造出一个类的对象


例:new(p)Date(10);


void * operator new(size_t sz, Date* d , int pos)        //定位new函数(重载)

{

           return &d [pos];

}

void * operator new(size_t sz,int*d,int pos)

{

           return &d [pos];

}

void main()

{

           Date *p = new Date;

           new (p)Date (1995, 1, 31);

           Date *p = new Date[10];

           new (p,2)Date (1995, 1, 31);        //定位new的应用,给第二个元素初始化

           int a[10];

           new (a, 5)int (10);

}


3.三种 new 实例:


#include<iostream>

#include<string>

using namespace std;


void * operator new(size_t n)       //操作符 new

{

           return malloc(n );

}

void operator delete(void *p)     //操作符 delete

{

          free( p );

}

void * operator new[](size_t n)    //操作符 new[]

{

           return malloc(n );

}

void operator delete[](void *p)    //操作符delete[]

{

          free( p );

}

class Date

{

public :

          Date( int x = 0):_date(x)

          {

                   

          }

          ~Date()

          {}

protected :

           int _date;

};


//模拟实现  new ,delete

void Test()

{

           Date *p = (Date *) operator new (sizeof (Date)*5);   //开辟空间

           for (int i = 0; i < 5; i++)

          {

                    new (p + i)Date (i*10);        //placement new (定位new) 指哪打哪!!!

          }

          

           for (int i = 0; i < 5; i++)

          {

                   (p + i)->~Date();           //显示掉用析构函数

          }

           operator delete (p);        //释放空间

}

void main()

{

          Test();

}


spacer.gif


spacer.gif