在“The C++ Programming Language”一书中,在操作列表(第 6.2 条)中,Bjarne Stoustrup 写道:
创建(放置)新(expr-list)类型
创建(放置和初始化)新的( expr-list )类型( expr-list )
我从来没有听说过这种new
运算符,我对它的作用很感兴趣。
在“The C++ Programming Language”一书中,在操作列表(第 6.2 条)中,Bjarne Stoustrup 写道:
创建(放置)新(expr-list)类型
创建(放置和初始化)新的( expr-list )类型( expr-list )
我从来没有听说过这种new
运算符,我对它的作用很感兴趣。
这称为放置新。您可以在已经存在的内存上创建一个对象。
你也可以有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
的,请求的大小作为第一个参数作为它们之前的前缀。