c++ - 能否帮忙解释一下placement new的原型

查看:78
本文介绍了c++ - 能否帮忙解释一下placement new的原型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

void operator new( size_t, void *p ) throw() { return p; }

这是我查到关于placement new的原型,size_t为什么在new(&str1) std::string("abc");中没有体现?为什么直接return p就可以了,是因为这个函数并没有写完全(只是原型)吗?

解决方案

首先你找到的不是placement new的声明,而是operator placement new的声明。这些operator被声明在头文件new里。

关于operator placement new,C++11标准有如下约定:

18.6.1.3.1 These functions are reserved, a C++ program may not define functions that displace the versions in the Standard C++ library (17.6.4). The provisions of (3.7.4) do not apply to these reserved placement forms of operator new and operator delete.

简言之,这些operator placement new暂时没任何用处。

然后,表达式new(&str1) std::string("abc")调用的并不是你找到的这个声明(但这个表达式内部的确会调用operator placement new)。operator placement new的调用方法是:::operator new(size, pointer);


C++中存在两种new,一种称为new expression,另一种称为operator new。前者会调用后者完成内存分配,然后构造对象。operator new被定义在头文件new中,如果程序未包含该头文件,则编译器会自动生成一套operator new。

也就是说,placement new expression和new expression内部会分别调用operator placement new和operator new,前者目前不做任何工作,后者应当申请存储区。(通常类重载operator new,就是重载的后者)

这篇关于c++ - 能否帮忙解释一下placement new的原型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆