繁体   English   中英

C ++中的“new(&variable)value;”有什么作用?

[英]What does “new (&variable) value;” in C++ do?

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

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

我的假设是它替换a with的内容Object(someOtherParameters) ,避免了为Object声明的可能的operator= 它是否正确?

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

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

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

并且您想在该内存上构造一个对象。 你打电话

new(rawMemory) Object(params);

现在,在释放内存之前

delete [] rawMemory; 

你必须明确地调用Object的derstuctor

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通常用于在原始内存中创建对象。 正如此代码所做的那样,在现有对象之上构造一个新对象是一个坏主意,因为它不会在原始对象上调用析构函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM