我最近碰巧使用new运算符重新初始化了一个C ++类,代码如下:
#include <iostream>
struct Test { Test() { std::cout<<"Test Ctor\n"; } };
int main()
{
Test t ;
new (&t) Test;
return 0 ;
}
如果运行此代码,则会调用Test ctor两次。在这种情况下,似乎'new'运算符使用指向对象的指针作为内存源而不是分配新内存,valgrind确认没有内存泄漏。
有人能否对“新”运算符的使用有所了解?
答案 0 :(得分:5)
此运算符称为placement new。它在给定地址处运行对象的构造函数,而无需事先分配内存。例如,可以在首先分配大型数组,然后在其上构建许多对象时使用它。
答案 1 :(得分:3)
它被称为“placement new”,通常用于构造特定内存位置的对象,而不是malloc
返回的默认值。
它不应该以这种方式使用(双重构造),并且标准没有说明以这种方式使用它的行为是什么。
那说,至少在过去。全球的iostream曾经依赖于这种双重结构。 (但这仍然不是一个好主意。)