不同意义的new和delete

1,new operator

2,operator new (即new expression)

3,Placement new

new operator :

string *ps = new string(“memory”);

以上动作实际做了两件事:

1,分配足够的内存。

2,调用一个constructor为刚分配的内存中的那个对象设定初值。

operator new :

通用声明:



void * operator new(size_t size);

函数里面具体是做什么,就看你的了,基本上都是直接返回一个原始的、未设置初值的内存。

可以这样调用:

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

Placement new:

针对一个已存在的对象调用其constructor。

使用举例:

class Dog{

Dog(int dogsize);

.......};

Dog* constructorDogInBuffer(void* buff, int dogsize)

{

    return new (buff) Dog(dogsize);

}

//---------------------------------delete分割线-----------------------------------------//

1,operator delete

2,delete operator

operator delete:

通常声明:

void operator delete(void *momery);    

与operator new搭配使用:

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

delete ps;

最后一个动作实际是分解成两步操作:

ps->~string();                //调用对象析构函数

operator delete(ps);      //释放内存

operator delete:

处理原始的,未设置初值的内存进行释放。

与operator new 搭配使用。这两个操作相当于C的malloc和free。

对于使用Placement new进行初始化内存的对象,应该在对象释放前主动调用其析构函数!然后再释放内存。

posted @ 2017-02-05 23:22  水蒸蛋不好吃  阅读(135)  评论(0编辑  收藏  举报