"new (expr-list) type"操作的含义和示例

Meaning and examples of "new (expr-list) type" operation

本文关键字:操作 new expr-list type      更新时间:2023-10-16

在《C++编程语言》一书中,在操作列表中,Bjarne Stoustrup写道:

创建(放置)新(expr列表)类型

创建(放置并初始化)新(expr列表)类型(expr名单)

我从未听说过这种new运算符,我很感兴趣它的作用

这被称为新放置。您可以在现有内存上创建对象。

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

您也可以有nothrow,例如:

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

告诉,在内存不足的情况下,new不会抛出std::bad_alloc,而是返回NULL


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

它按照你的指示执行。有些人用它来传递分配器环境和对齐。例如,在我写的一个语言运行库中,我做

new (myEnvironment) Variable(initialValue);

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

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

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