4

在“The C++ Programming Language”一书中,在操作列表(第 6.2 条)中,Bjarne Stoustrup 写道:

创建(放置)新(expr-list)类型

创建(放置和初始化)新的( expr-list )类型( expr-list )

我从来没有听说过这种new运算符,我对它的作用很感兴趣。

4

2 回答 2

3

这称为放置新。您可以在已经存在的内存上创建一个对象。

这是SO 中的一个解释和一个有用的问题

你也可以有nothrow,例如:

char* pzNewBuffer = new (nothrow) char [2048];

这说明,如果内存不足,它new不会抛出std::bad_alloc,而是会返回NULL


我想到的另一个例子 - 标准容器(可能)使用placement new: 当你调用时reserve,内存被分配,但没有在这个内存上构造/初始化。因此,当您插入(std::vector<T>::push_back例如)时,如果有分配但未初始化的内存 -placement new将被使用。

于 2012-07-07T09:12:24.247 回答
1

它做你告诉它做的事情。有些人使用它来传递分配器环境和对齐。例如在我写的语言运行时中

new (myEnvironment) Variable(initialValue);

clang 编译器将分配的 AST 资源与“ast 上下文”相关联,因此它执行类似的操作

new (AstContext, 32 /* alignment */) MyFooBar;

参数都作为单个参数列表传递给重载operator new的,请求的大小作为第一个参数作为它们之前的前缀。

于 2012-07-07T09:49:48.333 回答