C++ 的 new 和 delete : new operator, operator new, placement new, delete operator, operator delete

45 篇文章 0 订阅

C++ 的 new 和 delete : new operator, operator new, placement new, delete operator, operator delete

1. new operator

new operator 完成了两件事情:用于申请内存和初始化对象。

例如:
string* ps = new string("abc");

2.operator new
operator new 类似于C语言中的malloc,只是负责申请内存。

例如:
void* buffer = operator new(sizeof(string));
注意这里new前要有个operator。

3. placement new
用于在给定的内存中初始化对象。

例如:
void* buffer = operator new(sizeof(string));
buffer = new(buffer) string("abc");
调用了placement new,在buffer所指向的内存中创建了一个string类型的对象并且初始值为“abc”。

因此可以看出:new operator 可以分解operator new 和 placement new两个动作,是 operator new 和 placement new 的结合。

与new对应的delete没有 placement delete 语法,它只有两种,分别是delete operator 和 operator delete。
delete operator 和 new operator 对应,完成析构对象和释放内存的操作。而 operator delete 只是用于内存的释放,与C语言中的free相似。

例如:
string* ps = new string("abc");
...
delete ps;  // 调用 delete operator ,先析构对象再释放空间。

void* buffer = operator new(sizeof(string));
...
operator delete(buffer); // 只释放空间。

 

那么为什么没有和placement new对应的placement delete呢? 如:
delete(buffer) p;

据说,Stroustrup 回答说,这是因为无法确认 p 所指对象是否是真的在 buffer 中。

 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值