2016-08-04 3 views
0

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 

:

+0

꼬리 전화 최적화처럼 보이는 것은 문제가있는 버전에서 뭔가를 엉망으로 만들 수 있습니다. –

+0

최신 VS2015 커뮤니티에서도 같은 문제가 발생합니까? 그것은 아주 말하고있는 테스트 일 것입니다. – gdc

+0

[예상대로 작동] (http://rextester.com/VRNMO51268)와 VC15를 함께 사용하면 가치가 있습니다. –

답변

0

내가 모두 MSVC 2013 업데이트에 예를 시도 4, MSVC 2013 년 MSVC 2015 업데이트 2와 Coliru (http://coliru.stacked-crooked.com/)

나는 출력을 가지고 출력은 :

MSVC 2013 년 버그 것 같다 있도록

2 
2 

Coliru는 MSVC 2015의 출력을 확인

나는 가능하면 컴파일러를 업그레이드하거나 사용하는 것 중 하나

FuncA(); 
return; 

나는 그것이 약간 이상한 무효 돌아 어쨌든 다음 줄에 return 문을 선호하는 것이 좋습니다. (하지만 그건 내 생각 일 뿐이다.)

+0

사실 정수를 반환하고 여전히 같은 동작을하는 함수를 사용할 수 있습니다. – maxag

+0

'try {}'블록에'return;'문이 있으면이 문제가 발생하지 않는다는 것을 알았습니다. 이게 당신에게도 사실입니까? –