2016-08-04 7 views
0

で適切にクリーンアップは次のコードを考えてみましょうしない:Visual Studioの2013年、funcBのために生成されたアセンブリコード(下これをコンパイルするとのVisual Studio 2013は、try/catchブロック

#include <functional> 
#include <memory> 
#include <iostream> 

void FuncA(){} 

void FuncB(std::function<void()> callback) { 
    try { 
    // Do something here... 
    } 
    catch(...) { 
    return FuncA(); 
    } 

    // Do something else... 
} 

void main() { 
    auto foo = std::make_shared<bool>(); 
    auto callback = [foo]{}; 

    std::cout << foo.use_count() << std::endl; 
    FuncB(callback); 
    std::cout << foo.use_count() << std::endl; 
} 

を)しないクリーンアップコールバックこれは、fooの参照カウントを1増加させ、メモリリークを引き起こします。私は...

void FuncB(std::function<void()> callback) { 
    try { 
    // Do something here... 
    } 
    catch(...) { 
    FuncA(); 
    return; 
    } 

    // Do something else... 
} 

するfuncBのを変更した場合、私は予告をした

一つのことは、ある...そして、すべてが期待どおりに動作し、前後の数は同じです。

私はVS2013バージョン12.0.31101.00を使用しています。アップデート4 コンパイラのバージョンは18.00.31101 x64です。

この問題の原因は何ですか? MSVC 2015年に私が得たものの

2 
3 

+0

テールコールの最適化のように見えますが、問題のあるバージョンで何かを混乱させる可能性があります。 –

+0

最新のVS2015コミュニティでも同じ問題が発生していますか?それは非常に朗報です。 – gdc

+0

VC15と[期待どおりに動作する](http://rextester.com/VRNMO51268)は価値があります。 –

答えて

0

私は両方のMSVC 2013のアップデートであなたの例を試してみましたが4、MSVC 2013年にMSVC 2015アップデート2とColiru(http://coliru.stacked-crooked.com/

私は出力を得ました出力:

2 
2 

ColiruはMSVC 2015の出力を確認し、MSVC 2013

のバグのようです

私は、可能な場合には、コンパイラをアップグレード、または使用のいずれかでしょう:

FuncA(); 
return; 

私はそれは少し奇妙voidを返すようにして、とにかく次の行のreturn文を好むことを検討してください。 (しかしそれは私の意見です)

+0

実際には、整数を返しても同じ動作をする関数を使用できます。 – maxag

+0

'try {}'ブロックに 'return;'ステートメントが含まれている場合、この問題は発生しないことに気付きました。これもあなたにも当てはまりますか? –

関連する問題