new()语句的解释

Explanation of this new() statement

本文关键字:解释 语句 new      更新时间:2023-10-16

我正在检查一段c++代码,然后我遇到了这个语句块:

static void Vector3DefaultConstructor(Vector3 *self)
{    
    new(self) Vector3();    
}

我以前没有遇到过这样使用新的操作符。有人能解释一下为什么new这样叫吗?

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

更多信息请参见FAQ

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

obj->~Vector3();

谁能解释一下为什么new这样叫?

我可以告诉你它的作用。它有效地调用任意内存块上的构造函数,从而在该内存块上构造对象。常规new既分配内存又在内存中构造对象;new位置只完成后一部分。

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

真实示例:std::vector分配了足够多的内存来存储其当前负载,以降低push_back的平均成本。

如果它存储了一个T*data缓冲区,那么调用data=new T[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;
}