2012-11-11 5 views
2

을 종료, 나는이 간단한 콘솔 응용 프로그램을 만들었습니다 Apple 's Instruments,이 코드를 프로파일 링 할 때 어떤 누출도 볼 수 없습니다. 이것은 iPerson이 삭제되지 않았음에도 불구하고 있습니다.악기 프로그램이 데모를 위해서

+0

내 컴퓨터에서 valgrind가 "확실히 분실 : 4 블록 1 블록"을 올바르게 감지합니다. .. –

+0

어떤 프로그램을 사용하고 있습니까? 하나는 누수를보기위한 도구조차 필요하지 않습니다 ... – MFH

+1

@MFH - 이것은 실제로 제가보기 싫은 물체에 대해 아무것도 얻지 못한다는 사실을 보여주는 간단한 사례입니다 실제 문제는 다소 큰 프레임 워크와 테스트 응용 프로그램을 포함합니다. 테스트 응용 프로그램에서 삭제하지 않는 개체에 메모리 누수가 없기 때문에 이러한 응용 프로그램 개체에서 구성된 개체에 메모리 누수가 발생하지 않으며 문제가 수십 가지로 시연 될 수있을 때 나는 코드 라인의 hundrads를 제출하는 요점을 실제로 볼 수 없다. – Izhaki

답변

0

이 악기는 미리 정의 된 주파수에서 스냅 샷을 수행 누출. 기본적으로이 값은 "매 10 초마다"입니다. 프로그램은 10 초 전에 완료됩니다. 따라서, 누출은 절대로 수집되지 않습니다. 따라서 누설이 발견 되려면 iPerson이 범위를 벗어난 후에 실행을 일시 중지해야합니다. 또한 포인터가 여전히 스택이나 레지스터에서 참조되는 동안 sleep을 추가하면 누출이되지 않습니다.

0

Mac 개발자 라이브러리에서 Tips for Improving Leak Detection을 볼 수 있습니다.

Cppcheck C/C++ 코드 용 정적 분석 도구가 도움이 될 수도 있습니다. 귀하가 제공 한 예를 들어, 발견 :

#>cppcheck so_code.cpp 
Checking so_code.cpp... 
[so_code.cpp:15]: (error) Memory leak: iPerson 
1

나는 그것을 밖으로 일했다 :

  • 나는 1 초에 스냅 샷 간격을 설정했다.
  • 프로파일 링이 완료된 릴리스 버전에 대한 사용을 중지 (없음으로 설정)해야했습니다. 그리고 저스틴의 답변과 this question에 따라

, 정말처럼 내 코드를 수정했습니다 :

#include <iostream> 
#include <unistd.h> 

class Person { 
public: 
    int mAge; 
}; 

void CreateLeaks() 
{ 
    // All three lines will generate a leak. 
    Person *iPerson = new Person(); 
    iPerson = new Person(); 
    iPerson = new Person(); 
} 

int main(int argc, const char * argv[]) 
{ 
    CreateLeaks(); 

    sleep(2); 
    return 0; 
} 

여전히 계속 몇 가지 이상한 일이 있습니다. 예를 들어 CreateLeaks 안에 sleep(2)을 추가하기 시작하면 Instruments는 sleep 명령을 넣는 위치에 따라 모든 누출을 포착하지 않습니다. 이상