new operator和operator new

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在此基础上还调用析构函数。
上面只是做了简单的介绍,更深入的大家自己去查阅资料。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

vegetablesssss

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值