在“The C ++ Programming Language”一书中,在(第6.2条)的操作列表中,Bjarne Stoustrup写道:
创建(地点)新(expr-list)类型
创建(放置和初始化) new(expr-list)类型(expr-list)
我从未听说过这种new
运算符,我对它的作用感兴趣。
答案 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
,请求的大小作为第一个参数在它们前面加前缀。