@7shi ちなみにfooをmain内に展開するとg++ではhttp://t.co/9pq6k9VaですがMSVCでは回収されないという結果になりました。
2011-12-12 22:16:58@nagoya313 このコードで実験した結果、MSVCではキャプチャした変数がスタックの走査で出てくるのに対して、g++だとvtableみたいな感じで一度ポインタをたどらないと検出できないことがわかりました。 http://t.co/J5yDx8a3
2011-12-13 07:43:38@nagoya313 参照はアセンブリレベルではポインタと同じ扱いなので、ポインタを値キャプチャすれば参照キャプチャと同じ結果となりました。 http://t.co/J5yDx8a3 この結果から、MSVCだとgc_ptrがなくても検出可能ですが、g++では不可となります。
2011-12-13 21:48:24@nagoya313 ええと、すみません、問題点が分からなくなって来ました。この前のコードというのは http://t.co/uCSQh2NL のfooをmain内に展開したコードのことでしょうか?私がgc_ptrを導入したのは、2段階参照が単なるスキャンで検出できないためです。
2011-12-13 22:06:57@nagoya313 資料の例は、ポインタが検出できない(=マークされない)ために、解放されてはいけないタイミングで解放されてしまうのを問題視しています。この例では127行目のgc_collect()で解放されないのが正しい動作です。 http://t.co/cm0nAdMH
2011-12-13 22:22:56@nagoya313 それは良かったです。私も今回の議論がなければMSVCでキャプチャの内部仕様が異なることに気付かなかったので、助かりました。
2011-12-13 22:32:31@7shi 詰まりはmsvcではgc_ptrはいらないってことですよね。あともしかしたらですが、ラムダというよりはstd::functionの実装の差って説はないでしょうか。
2011-12-13 22:37:27@nagoya313 はい、今回のようなキャプチャに対して、MSVCではgc_ptrは必要ありません。ですがgc_ptrは『GC管理されていないインスタンス』から『GC管理されているインスタンス』を参照している間は解放させないためのものなので、その用途では必要です。
2011-12-13 22:51:03@nagoya313 ラムダ式をスキャンしたところ値が検出されました。std::functionの実装の差のようです。 http://t.co/HFvqN7jQ ご指摘ありがとうございました。
2011-12-13 23:08:01