で適切にクリーンアップは次のコードを考えてみましょうしない: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
:
テールコールの最適化のように見えますが、問題のあるバージョンで何かを混乱させる可能性があります。 –
最新のVS2015コミュニティでも同じ問題が発生していますか?それは非常に朗報です。 – gdc
VC15と[期待どおりに動作する](http://rextester.com/VRNMO51268)は価値があります。 –