new operator
有时会碰到一些面试题:请说明new operator和operator new之间的差异?
在堆内存上申请一块string空间,我们通常会这样写:
string *ps = new string("ss");
上面使用的是new operator,它的动作有两个含义:
1.在堆中分配足够多的空间来放置对象
2.调用构造函数,为对象设定初值
事实上,在第一步中new operator调用了operator new来分配内存空间,函数operator new通常声明如下:
void *operator new(size_t size);
返回一个指向一块原始的、未设定初值的内存,和malloc功能一样。
虽说我们从未直接调用过operator new,但还是可以直接调用它:
void *p = operator new(sizeof(int));
再来看看上面的string类型指针ps,事实上它的调用过程如下:
1.void *memory = operator new(sizeof(string));
2.调用string的构造函数string(“ss”);
3.完成指针类型转换:string *ps = static_cast<string *>(momory);
placement new
placement new为特殊版本的operator new,它可以在指定的内存空间上分配对象。
void*p = new int;
int *ip = new(p) int();
区别
1.将对象产生于堆中,使用new operator,不但分配内存还调用构造函数
2.只打算分配内存,使用operator new,没有构造函数被调用
3.想要在堆内存中自己决定内存的分配方式,可以重写operator new,然后在使用new operator的时候会调用operator new
4.在已分配(拥有指针)的内存中构造对象,使用placement new.
delete operator和operator delete差不多,operator delete单纯的释放内存,而delete operator在此基础上还调用析构函数。
上面只是做了简单的介绍,更深入的大家自己去查阅资料。