try/catch 블록에서 정리를하지 않는 : 비주얼 스튜디오 2013에서이 문제를 컴파일 할 때비주얼 스튜디오 2013가 제대로 다음 코드를 고려
#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;
}
을 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입니다.
이 문제의 원인은 누구입니까? MSVC 2015 년에 내가 가지고 있지만
2
3
:
꼬리 전화 최적화처럼 보이는 것은 문제가있는 버전에서 뭔가를 엉망으로 만들 수 있습니다. –
최신 VS2015 커뮤니티에서도 같은 문제가 발생합니까? 그것은 아주 말하고있는 테스트 일 것입니다. – gdc
[예상대로 작동] (http://rextester.com/VRNMO51268)와 VC15를 함께 사용하면 가치가 있습니다. –