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();
}