“new(expr-list)类型”操作的含义和示例

时间:2012-07-07 09:08:31

标签: c++ new-operator

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

  

创建(地点)新(expr-list)类型

     

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

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

2 个答案:

答案 0 :(得分:3)

这称为placement-new。您可以在现有内存上创建对象。

这是一个explanation和一个有用的question in SO

您还可以拥有nothrow,例如:

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

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


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

答案 1 :(得分:1)

它做你告诉它做的事。有些人用它来传递分配器环境和路线。例如,在我编写的语言运行库中,我做了

new (myEnvironment) Variable(initialValue);

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

的操作
new (AstContext, 32 /* alignment */) MyFooBar;

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