#include <iostream> class A { public: int a1; char *p; int a2;}; class B {public: int b1; int b2;}; union C { A aa; B bb;}; C c = { aa:{ 1, "hoge", 2 } }; C d = { bb:{ 3, 4 } }; int main(){ std::cout<< c.bb.b2 << "\n"; return 0;}
extern istream cin;///< Linked to standard input extern ostream cout;///< Linked to standard output extern ostream cerr;///< Linked to standard error (unbuffered) extern ostream clog;///< Linked to standard error (buffered) #ifdef _GLIBCPP_USE_WCHAR_T extern wistream wcin;///< Linked to standard input extern wostream wcout;///< Linked to standard output extern wostream wcerr;///< Linked to standard error (unbuffered) extern wostream wclog;///< Linked to standard error (buffered) #endif
そんなわかりにくいか? それともそういう局面自体が想像外なのか? あるオブジェクトを”割り当て済みのメモリ領域に”生成したいときに使うのが placement new だ。 コンストラクタやデストラクタの振る舞いなんかは二の次。 詳しいことは More Effective C++ の第8項を読むといい。
placement new は実際にシステムからメモリを”確保”することは行っていないし、 それに対応する”解放”処理もその意味でのメモリの”解放”は行わないってことは踏まえてるか? いや、俺も>>225で不用意な言い方したんで悪かったと思う。 #placement new でなされる処理をメモリの”確保”と呼ぶのなら #それに合わせようとしたんだが過度な誤解を与えそうな言い方なのは確かだ。 しかしそこまで基本からはずれた問だと揚げ足取るための例かと邪推してしまうぞ。