问题 新(这)意味着什么?


我发现这个代码示例用于研究:

T & T::operator=(T const & x)
{
  if (this != &x)
  {
    this->~T(); // destroy in place
    new (this) T(x); // construct in place
  }
  return *this;
}

当我看着 文件 对于 new 没有带指针的版本。从而:

  1. 新(这)意味着什么?
  2. 它是干什么用的?
  3. 如果未在文档中列出,如何调用它?

10160
2018-03-24 08:45


起源

谷歌安置新。 - jfly
stackoverflow.com/questions/222557/... - Ben
可能重复 我可以在operator =中使用placement new(this)吗? - Oliver Charlesworth
你没有找到它,因为那是新文档 操作者,而不是表达式: en.cppreference.com/w/cpp/language/new - Karoly Horvath
我不认为这个问题应该被关闭。人们找到我的问题的答案可能会有所帮助 如果他们不知道新的安置  - 如果他们有这个问题,他们可能不会这样做。此外,该问题还询问为什么会在这种情况下使用它。因此,它与上面标记的可能重复不同。 - Joseph Malicke


答案:


它被称为“placement new”,您的代码片段中的注释几乎可以解释它:

它构造了一个类型的对象 T 没有为它分配内存,在括号中指定的地址。

所以你要看的是一个复制赋值运算符,它首先销毁被复制的对象(不释放内存),然后在同一个内存地址中构造一个新的。 (正如评论中所指出的那样,以这种方式实现运算符也是一个非常糟糕的主意)


13
2018-03-24 08:48



值得注意的是,如果构造失败(抛出异常),则内存处于 *this 将不包含有效对象,以及将来尝试使用该对象(包括任何析构函数调用,如果该对象超出范围或是 deleted)将具有未定义的行为。 - Tony Delroy
另外值得注意的是,在派生类中(如果类不禁止派生),赋值运算符中的placement new可能会设置一个指向错误类的vtable指针,同样使用Undefined Behavior。 - Cheers and hth. - Alf
@jalf:“你正在看的是一个复制构造函数,”应该是“你正在看的是一个复制赋值操作符”。 - Cheers and hth. - Alf
@ Cheersandhth.-Alf gah,是的,你当然是对的!感谢您指出了这一点。 - jalf
而且值得注意的是,没有什么能阻止您使用具有自动存储的参数调用此运算符。这是一个灾难的食谱。 - Damon