考慮下面的代碼:的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;
}
當的Visual Studio 2013下編譯這一點,FuncB生成的彙編代碼()不清除回調正確的,這會將foo的引用計數增加1,並導致內存泄漏。
有一件事我沒有注意到,就是如果我改變FuncB是...
void FuncB(std::function<void()> callback) {
try {
// Do something here...
}
catch(...) {
FuncA();
return;
}
// Do something else...
}
......然後一切按預期工作和之前的數量和所追求的一樣。
我正在使用VS2013版本12.0.31101.00更新4 編譯器版本是18.00.31101 x64。
有沒有人有一個想法是什麼造成這個問題?
看起來像尾調用優化可能已經在有問題的版本中搞砸了。 –
在最新的VS2015社區中是否出現同樣的問題?這將是一個非常有說服力的測試。 – gdc
[按預期工作](http://rextester.com/VRNMO51268)與VC15,它的價值。 –