c++ - 我可以通过引用调用placement-new和析构函数吗?

标签 c++ pointers reference placement-new

我可以传递对未初始化内存的引用,获取地址,然后调用placement-new或在获得的内存位置上调用析构函数吗?换句话说,以下程序是合法的 C++ 还是具有未定义行为:

#include <string>
#include <iostream>

void ctor (std::string &s)
{
  new (&s) std::string ("Hello, world!");
}

void dtor (std::string &s)
{
  (&s)->std::string::~string ();
}

int main ()
{
  std::string * memory = static_cast<std::string *> (
    operator new (sizeof (std::string) * 10));

  ctor (memory [0]);

  std::cout << memory [0] << '\n';

  dtor (memory [0]);

  operator delete (memory);
}

它当然有效,我尝试了 gcc 的未定义行为清理程序,它没有产生任何错误。但任何人都可以根据标准来确认/反驳吗?

最佳答案

上面的代码在 [0] 处双重构造了一个字符串,这是潜在的资源泄漏,并且双重销毁了它,这是未定义的行为。

new string[10] 在数组中构造对象。 delete[] 销毁对象。您在另一个对象之上创建一个新对象,然后销毁它,然后在删除[]时再次销毁它。

其他看起来没有什么问题;我的意思是它使用原始分配,这通常是不好的做法,并且代码异常不安全等。

关于c++ - 我可以通过引用调用placement-new和析构函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47971664/

相关文章:

c# - 虚函数只能在 C++ 中重写吗?

c - 指针具体指向哪里?

c - 从字符串中删除空格

c++ - 在 C++ 中初始化对成员的引用为 NULL

exception-handling - 无法解析主要引用 XXX,因为它间接依赖于框架程序集

c++ - libodbc++ 处于休眠状态吗?有明确的继任者吗?

C++ 继承 : virtual member needs redeclaring?

c - 我们如何标准化指针?

java - 传递数组引用时,如何更改对其他数组的引用?

c++ - 在for循环中减少2个变量?