class A{public: int n; A(int n_):n(n_){}}; A* get_aptr(A& a){return &a;} void main(){ printf("%d\n", get_aptr(A(10))->n ); }
2010-09-30 16:08:33このコードは、とりあえずVisual C++ 2008では正常に動作しているように見える。しかしこれがVC++だからたまたま動いているのか、仕様として規程されている正しい動作なのか、なんとも言えない。
2010-09-30 16:10:03ようは、引数としてそこで直にインスタンス変数を宣言した場合の挙動についてなのであるが、例えば「printf("%d\n", A(10).n );」の場合はどうやら正しく動くらしい、と言う事は前々から知っていた。
2010-09-30 16:20:16私はこの挙動について、「引数で直で生成したインスタンス変数は、その関数が終わるまで持続、その後破棄される」と思っていた。その理論で行けば今回の例は、「get_aptr(A(10))」を抜けた段階で、A(10)のインスタンス変数は破棄される…と思っていた。が、どうやら違うらしい…
2010-09-30 16:21:14@myun2 あれじゃね、A(10)の破棄はされてるんだけどそのアドレスにまだ10が残ってるんじゃ。デストラクタでn=0してみたらどうなるかな?w
2010-09-30 16:25:42class A { public: A(){ printf("Constructed!!\n"); } virtual ~A(){ printf("Destructed!!\n"); } int hoge(){ return printf("hoge Called
2010-09-30 16:29:47.\n"); } }; A* get_aptr(A& a){ return &a; } void main() { printf("%d\n", get_aptr(A())->hoge() ); printf("printf ended.\n"); }
2010-09-30 16:29:58実行結果: Constructed!! hoge Called. 13 Destructed!! printf ended.
2010-09-30 16:31:07という事なんだがこの挙動がC/C++の仕様として正しいもんなのかどうか調べるのにどう検索すればいいのか分からず途方に暮れていた。(何
2010-09-30 16:34:10class A { public: A(){ printf("A Con\n"); } virtual ~A(){ printf("A Des\n"); } int hoge(){ return printf("Call\n"); } };
2010-09-30 16:48:57