"new (expr-list) type"操作的含义和示例
Meaning and examples of "new (expr-list) type" operation
在《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
,请求的大小作为它们前面的第一个参数。
相关文章:
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 重载操作程序时出错>>用于类中的字符串 memebr
- 对字符串进行位操作
- 如果"new int"返回"int*",那么为什么"new int[n]"不返回"int**"?
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 重载运算符new[]的行为取决于析构函数
- 我可以在 C++ 中的函数体之外进行操作吗?
- MPI突然停止了对多个核心的操作
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 对字符数组中的元素执行逐位操作
- 如何在directx/c++中进行平移/缩放操作
- 逐位操作的隐式类型转换
- 为什么一个向量上的多线程操作很慢
- 过载'operator new'如何导致无限循环?
- 创建具有 new in 函数和"this is nullptr"异常的对象
- Codelite C++ new project
- "new (expr-list) type"操作的含义和示例
- 如何在 boost::xpressive 语义操作中使用 "new" 运算符?
- 正在对使用operator new okay的放置delete操作的结果调用delete
- 对内存分配和构造函数的调用是否可以与执行"new"表达式所需的其他操作交错?