三\n")

三\n")
3
タンボホ (公式) @aidaho__3

引数として指定されたスタック変数の生存期間について。

2010-09-30 16:06:16
タンボホ (公式) @aidaho__3

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
タンボホ (公式) @aidaho__3

このコードは、とりあえずVisual C++ 2008では正常に動作しているように見える。しかしこれがVC++だからたまたま動いているのか、仕様として規程されている正しい動作なのか、なんとも言えない。

2010-09-30 16:10:03
だいじん @daijin

@myun2 何これこんなので動くの?w

2010-09-30 16:15:25
タンボホ (公式) @aidaho__3

@daijin 動く動く。普通に動く。(とりあえずVC++の場合は

2010-09-30 16:17:28
タンボホ (公式) @aidaho__3

ようは、引数としてそこで直にインスタンス変数を宣言した場合の挙動についてなのであるが、例えば「printf("%d\n", A(10).n );」の場合はどうやら正しく動くらしい、と言う事は前々から知っていた。

2010-09-30 16:20:16
だいじん @daijin

@myun2 A(10)でそのままprintfまで引数に渡せちゃうんだなあ、凄い。printf抜けたらインスタンス消えそうね。

2010-09-30 16:20:46
タンボホ (公式) @aidaho__3

@daijin printf抜けたら流石に消えるねー。

2010-09-30 16:22:06
タンボホ (公式) @aidaho__3

私はこの挙動について、「引数で直で生成したインスタンス変数は、その関数が終わるまで持続、その後破棄される」と思っていた。その理論で行けば今回の例は、「get_aptr(A(10))」を抜けた段階で、A(10)のインスタンス変数は破棄される…と思っていた。が、どうやら違うらしい…

2010-09-30 16:21:14
だいじん @daijin

@myun2 あれじゃね、A(10)の破棄はされてるんだけどそのアドレスにまだ10が残ってるんじゃ。デストラクタでn=0してみたらどうなるかな?w

2010-09-30 16:25:42
タンボホ (公式) @aidaho__3

class A { public: A(){ printf("Constructed!!\n"); } virtual ~A(){ printf("Destructed!!\n"); } int hoge(){ return printf("hoge Called

2010-09-30 16:29:47
タンボホ (公式) @aidaho__3

.\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
タンボホ (公式) @aidaho__3

print文使ってデストラクタの挙動見てみた方が確実だね。と言う事で書いてみた。

2010-09-30 16:30:34
タンボホ (公式) @aidaho__3

実行結果: Constructed!! hoge Called. 13 Destructed!! printf ended.

2010-09-30 16:31:07
タンボホ (公式) @aidaho__3

ちゃんとprintf文(mainの方の)が呼び出された後にデストラクタが呼ばれてる・・・!!

2010-09-30 16:31:45
タンボホ (公式) @aidaho__3

という事なんだがこの挙動がC/C++の仕様として正しいもんなのかどうか調べるのにどう検索すればいいのか分からず途方に暮れていた。(何

2010-09-30 16:34:10
タンボホ (公式) @aidaho__3

@daijin ンム。そして興味深いと共に、謎である。(何

2010-09-30 16:40:14
るね王 @stillness

\n") が顔文字に見えた

2010-09-30 16:31:37
タンボホ (公式) @aidaho__3

class 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