假设我在 C++ 程序中有以下代码:
Object a = Object(someParameters);
new (&a) Object(someOtherParameters);
我的假设是它替换了a
with的内容Object(someOtherParameters)
,避免了可能operator=
声明的 for Object
。它是否正确?
假设我在 C++ 程序中有以下代码:
Object a = Object(someParameters);
new (&a) Object(someOtherParameters);
我的假设是它替换了a
with的内容Object(someOtherParameters)
,避免了可能operator=
声明的 for Object
。它是否正确?
这称为放置新。它在指定内存上调用构造函数,而不是分配新内存。请注意,在这种情况下,您必须在释放分配的内存之前显式调用对象的析构函数。
澄清。假设您分配了一些原始内存
char * rawMemory = new char [sizeof (Object)];
并且您想在该内存上构造一个对象。你打电话
new(rawMemory) Object(params);
现在,在释放内存之前
delete [] rawMemory;
您将不得不显式调用 Object 的 derstuctor
reinterpret_cast<Object*>(rawMemory)->~Object();
但是,在您的特定示例中,潜在的问题是您没有正确销毁现有对象,然后再在其内存中构建一个新对象。
奖励:
有没有想过标准如何std::vector
在其包含的对象不被默认构造的情况下做到?原因是在大多数(如果不是全部的话)实现allocator<T>
中不存储 a T* p
,这将要求 T 在p = new T[N]
. 相反,它存储一个char
指针原始内存,并分配p = new char[N*sizeof(T)]
. 当你push_back
是一个对象时,它只是调用复制构造函数,并将 new 放置在该 char 数组中的适当地址上。
它被称为放置新Object
:它在括号内给出的地址处构造新的。放置 new 通常用于在原始内存中创建对象。像这段代码那样在现有对象之上构造一个新对象是个坏主意,因为它不会调用原始对象的析构函数。