2017-09-20 11 views
0

나는 몇 가지 테스트를 실시, 내 질문에 대답하려면 :std :: exit leak 메모리를 종료 할 수 있습니까?

(복제 다음은 필요한 포함)

#include <cstdlib> 
#include <memory> 

내가 main 기능에 std::unique_ptr로, std::exit라는 기능을했다.

void some_function() 
{ 
    std::exit(EXIT_SUCCESS); 
} 

int main() 
{ 
    std::unique_ptr<int> relying_on_raii{new int{5}}; 
} 

나는 unique_ptr 선언 후 some_function라고하면 메모리 누수가 있습니다.

1 potential leak(s) (suspected false positives) 
     […] 
    6 unique,  6 total, 797 byte(s) of still-reachable allocation(s) 

대로는 7 잠재적 누수가 발생한 두 번째 예에서 볼 수있는,

1 potential leak(s) (suspected false positives) 
     […] 
    7 unique,  7 total, 801 byte(s) of still-reachable allocation(s) 
되었다

두 로그 나는 다음 줄에 차이가 Dr. Memory에서 가져온 크기는 정확히 4 자이고, 정확히 int의 크기입니다. 이 테스트를 두 번 반복하면 std::exit 테스트에서 실제로 805 byte(s)이되는 것으로 나타났습니다.

안전한 사용 기능은 std::exit이거나 항상 메모리 누수를 방지하기 위해 메인에서 돌아와야합니까?

+0

'exit'를 호출하는 경우 여전히 누출이 주요 관심사입니까? 스택을 푸는 데 신경 쓰면. 'main' 만 잡을 수있는 예외를 던집니다. – StoryTeller

+0

@StoryTeller 나는 std :: exit를 내 프로그램을 종료하는 일반적인 방법으로 사용하고 싶다. 왜냐하면 리턴 값을 3 번 호출해야하고, 재시작 여부를 bool 값으로 검사해야하기 때문에 std : : exit'. '던짐 '은 흥미로운 아이디어이지만 성공한 출구를 던질 수있는 해킹처럼 보입니다. – kim366

+0

프로그램이 종료되면 누출 된 것이 무엇입니까? OS가 프로세스를 정리합니다. – NathanOliver

답변

1

std :: exit는 안전 기능을 사용하지 않으므로 항상 메모리 누수를 방지하기 위해 main에서 돌아와야합니까?

예, 메모리가 누출 될 수 있습니다.

그래도 덜 걱정스러운 문제입니다. 더 중요한 문제는 프로그램이 프로세스를 종료하여 해제 할 수없는 리소스를 얻은 경우입니다. 이러한 경우를 처리하려면 main을 종료하거나 try-throw-catch을 사용하여 main이 모든 catch되지 않은 예외를 catch하고 정상적으로 종료 할 수있을 때까지 오류 상태로 돌아가는 것이 좋습니다.