【发布时间】:2018-06-06 21:18:14
【问题描述】:
我可以传递对未初始化内存的引用,获取地址,然后调用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 的未定义行为清理程序,它没有产生任何错误。但是任何人都可以根据标准确认/反驳。
【问题讨论】:
-
@CaptainObvlious 是的,这不是本意。谢谢!
-
您可以使用 static_cast 代替。并且没有必要将参数转换为
operator delete -
@M.M 是的,这样更好。谢谢!
标签: c++ pointers reference placement-new