C++"new (&variable) value;"做什么?



假设我在C++程序中有以下代码:

Object a = Object(someParameters);
new (&a) Object(someOtherParameters);

我的假设是,它将a的内容替换为Object(someOtherParameters),从而避免为Object声明可能的operator=。这是正确的吗?

它被称为placement new。它调用指定内存上的构造函数,而不是分配新内存。请注意,在这种情况下,在释放分配的内存之前,必须显式调用对象的析构函数。

澄清。假设您已经分配了一些原始内存

char * rawMemory = new char [sizeof (Object)];

你想在这个内存上构造一个对象。你打电话给

new(rawMemory) Object(params);

现在,在释放内存之前

delete [] rawMemory; 

你必须显式地调用对象的描述符

reinterpret_cast<Object*>(rawMemory)->~Object();

然而,在您的特定示例中,潜在的问题是,在内存中构造新对象之前,您没有正确地销毁现有对象。

好处:有没有想过标准std::vector在其包含的对象不默认可构造的情况下该怎么做?原因是,在大多数(如果不是全部的话)实现中,allocator<T>不存储T* p,这将要求T在p = new T[N]的情况下是默认可构造的。相反,它存储一个char指针-原始内存,并分配p = new char[N*sizeof(T)]。当您push_back一个对象时,它只调用复制构造函数,并在该char数组中的适当地址上放置new。

它被称为placement-new:它在括号内给定的地址构造新的Object。Placement new通常用于在原始内存中创建对象。像这段代码那样,在现有对象的基础上构造一个新对象是个坏主意,因为它不会对原始对象调用析构函数。

相关内容

最新更新