C++ 'new'运算符 - 使用模式?

C++ 'new' operator - Modes of use?

本文关键字:模式 运算符 new C++      更新时间:2023-10-16

我最近遇到了一个不寻常的使用新运算符来重新初始化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过去依赖于这种双重结构。(但这仍然不是一个好主意。)