初期化されていないメモリへの参照を渡し、アドレスを取得してからplacement-newを呼び出したり、取得したメモリ位置でデストラクタを呼び出すことはできますか?言い換えると、次のプログラムの法的Cである++またはそれは、未定義の動作をしているん:リファレンスを介してplacement-newとデストラクタを呼び出すことはできますか?
#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ええ、それはよかったです。ありがとう! –