C++ 'new'运算符 - 使用模式?
C++ 'new' operator - Modes of use?
我最近遇到了一个不寻常的使用新运算符来重新初始化C++类的情况,代码如下:
#include <iostream>
struct Test { Test() { std::cout<<"Test Ctorn"; } };
int main()
{
Test t ;
new (&t) Test;
return 0 ;
}
如果运行此代码,则会调用两次Test ctor。在这种情况下,"new"运算符似乎使用指向对象的指针作为内存源,而不是分配新内存,valgrind确认没有内存泄漏。
有人能解释一下"新"运算符的用法吗?
此运算符称为placement-new。它在给定的地址运行对象的构造函数,而无需事先分配内存。例如,当首先分配一个大数组,然后在上面构造许多对象时,可以使用它。
它被称为"placement new",通常用于在特定内存位置构建对象,而不是malloc
返回的默认值。
它不应该以这种方式使用(双重结构),标准也没有说明以这种方式的使用行为
至少在过去是这样。全局iostream过去依赖于这种双重结构。(但这仍然不是一个好主意。)
相关文章:
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 为什么比较运算符如此快速
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 增量运算符与后缀混淆
- 一个关于在C++中重载布尔运算符的问题
- 运算符C++ "delete []"仅删除 2 个前值
- 为什么在保护模式下继承升级不起作用
- 模板类无法识别友元运算符
- 如何在全屏模式下(在OpenGL中)使背景透明
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 用户定义的文本运算符(在原始模式下)存在问题
- 在编写自己的流运算符时,如何检查当前的 ostream dec/hex 模式?
- 为什么 std::optional 运算符* 没有 has_value() 的调试模式断言
- C++ 运算符重载 如何在 OpenCV 中实现像 Mat_ 的 CTOR 这样的模式<type>
- 在单例设计模式中使用复制构造函数和赋值运算符
- C++ 'new'运算符 - 使用模式?
- 动态上下文相关运算符的设计模式(例如模运算)
- 特定预期模式的提取运算符覆盖