解释这个新的()语句 我正在复习一段C++代码,我是从这个语句块中得出的: static void Vector3DefaultConstructor(Vector3 *self) { new(self) Vector3(); }

解释这个新的()语句 我正在复习一段C++代码,我是从这个语句块中得出的: static void Vector3DefaultConstructor(Vector3 *self) { new(self) Vector3(); },c++,C++,我以前从未遇到过这样使用的新操作员。有人能解释一下为什么会这样调用new吗?这叫做“placementnew”。默认情况下,它不分配内存,而是在给定的位置构造对象(这里,self)。但是,对于一个类,它可以重载 有关更多信息,请参阅 销毁使用placementnew构建的对象的正确方法是直接调用析构函数: obj->~Vector3(); 有人能解释一下为什么会这样叫new吗 我可以告诉你它的作用。它有效地对任意内存段调用构造函数,从而在该内存段中构造对象。常规new既分配内存又在内存中

我以前从未遇到过这样使用的新操作员。有人能解释一下为什么会这样调用new吗?

这叫做“placement
new
”。默认情况下,它不分配内存,而是在给定的位置构造对象(这里,
self
)。但是,对于一个类,它可以重载

有关更多信息,请参阅

销毁使用placement
new
构建的对象的正确方法是直接调用析构函数:

obj->~Vector3();
有人能解释一下为什么会这样叫new吗

我可以告诉你它的作用。它有效地对任意内存段调用构造函数,从而在该内存段中构造对象。常规
new
既分配内存又在内存中构造对象;新的布局只做后一部分


至于为什么有人会写这些代码?没有线索。如果对象采用
void*
而不是
Vector3*
,则更有意义。但是,除非
Vector3::Vector3()
是私有的,否则没有理由将新用法隐藏在这样的静态函数中。

现实世界示例:
std::vector
分配了足够的内存来存储其当前负载,以降低
推回的平均成本

如果它存储了一个
T*data
缓冲区,那么调用
data=newt[capacity]
将默认构造一个
T
对象的加载。问题是,
vector
的语义是,它只包含您输入的内容:我们可以为对象预先分配内存,但这些对象不应该存在

解决方案是将
vector::data
成员设为
void*
并为其分配非类型内存。现在,每当我们向容器添加一个对象时,我们都需要构造它,以便使这个对象存在并赋予原始指针意义

template <typename T>
void vector <T> :: push_back (const T & value)
{
    resize (m_size + 1);
    // construct a new T in the void buffer.
    new (reinterpret_cast <T*> (m_data) + m_size) T (value);
    ++ m_size;
}

template <typeame T>
void vector <T> :: pop_back ()
{
    (reinterpret_cast <T*> (m_data) + m_size) -> ~ T ();
    -- size;
}
模板
无效向量::推回(常量T和值)
{
调整大小(m_大小+1);
//在空缓冲区中构造一个新的T。
新(重新解释铸型(m_数据)+m_尺寸)T(值);
++m_尺寸;
}
模板
void vector::pop_back()
{
(重新解释铸型(m_数据)+m_大小)->~T();
--大小;
}

嗯,也可能会有一个特别的
Vector3*
重载。如果使用placement new,则不需要确保在某个时候调用
self->~Vector3()
。普通C++对象有一个定义良好的生命周期,当你需要放置新的时候,这是因为你在做一些语言无法直接提供的东西。它不调用任意一块内存上的构造函数。它在给定的内存块上调用构造函数。@Nawaz,给定的内存块是任意的。@LucDanton:这是不同的。并不意味着汤姆·哈里和迪克都会做饭。@Nawaz好吧,任何有效的指针都可以指向新的位置,所以在你的比喻中,汤姆·迪克和哈里都会做饭。吕克是对的。Nicol没有说的是“在它所选择的一段内存上调用构造函数”,但这显然是你读它的方式。@spraff:一个不知道新位置是什么的人,更可能用我的方式来解释这个句子。因此,它具有误导性。正如答案所说,“一段给定的记忆”肯定比“一段任意的记忆”更好更清晰,它是新的。编写这一点的实际原因可能是提供C++兼容的接口到C++库,尽管其他用途(比如我的STD::vector示例)有点传统。