我可以传递对未初始化内存的引用,获取地址,然后调用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/