2009-12-04 3 views
2

내가 내 테스트 & 동안 우분투 9.10프로그램 디버그 중에 메모리 누수가 발생할 수 있습니까? 이 단지 디버그 중에 분명히 -

나는 C 프로그램을 쓰고 있어요에서 개발하고있어 내가 malloc을 호출하고 항상 무료()를 호출하는 것을 기억하고있어 디버깅.

저는 궁금합니다. 시스템에서 사용 가능한 메모리를 모두 먹었습니까? 또는 IDE에서 응용 프로그램을 종료 한 후 커널이 프로세스 메모리를 정리합니까? 논리적으로 추론 나는 커널이 전체 프로세스가 죽었다는 사실을 잘 알고 있으므로 할당 된 메모리를 알고 있으므로 응용 프로그램이 free를 호출하지 않아도 메모리가 여전히 해제되고 있음을 알 수 있습니다.

나는 설명을 바르게 평가할 것이다.

고맙습니다. Maxim.

답변

7

예, 운영 체제는 실행이 중지되면 프로그램에 할당 된 모든 메모리를 회수합니다.

2

정확합니다.

디버깅중인 프로그램이 종료되면 '누수 된'메모리가 즉시 해제되므로 심각한 문제가 아닙니다.

메모리 누수는 일반적으로 프로세스가 오래 실행되는 경우에만 중요합니다.

+0

짧은 실행 응용 프로그램에서 메모리가 누출된다는 것은 괜찮습니까? 메모리 누수가 실제로 발생하는 것보다 더 해롭지 않게 만듭니다. – pmr

+0

그것은 항상 흑백이 아닌 상황 적이지만 일반적으로 메모리 누수가 심각하지 않으면 짧은 실행 프로그램에서 심각하지 않습니다. –

+1

문제는 단명 한 애플리케이션을 작성한 코드가 지금부터 1 년 후에 어떻게 사용되는지 알지 못한다는 것입니다. – shoosh

2

커널은 커널 메모리 내에 프로세스 레코드 콜렉션을 가지고 있으며 각 프로세스, 소비 된 메모리 양, 입출력, 파일 핸들 또는 inode와 같은 자원을 추적합니다. 프로세스 레코드는 대개 커널의 작업 포인터가 프로세스 기록을 가리키는 대기열에 있습니다 (즉, '멀티 태스킹'에 대한 인식이 왜 그렇게 눈을 깜박 거리게하는지 설명합니다) , 정말로, 그것은 커널의 관점에서 단일 태스크를 수행하고있다). 상기 프로세스에 의해 얼마나 많은 메모리가 씹어 올려 졌는지를 알려주는 필드가 프로세스 레코드에있다.

예 커널은 다른 프로세스에서 사용할 수 있도록 자체 풀에 메모리를 다시 확보합니다. 또한 위의 John Weldon이 지적한 것처럼 메모리 누수와 관련하여 절대적으로 100 % 정확합니다. 나는 다른 posting에서 이것을 언급했다. 메모리 누수가 없다면 모든 malloc은 무료이다. 따라서 디버깅 세션에 대해 걱정하지 마십시오. 커널이 메모리를 확보 할 책임이 있기 때문에 완벽하게 괜찮습니다.

일부 응용 프로그램 (특히 데몬)은 다음 번 다시 부팅하기 전에 데몬이 장시간 실행되므로 일부 응용 프로그램 (특히 데몬)을 디버깅해야하며 메모리 누수가 발생하지 않아야합니다. 덧붙여 말하자면 내가 가장 좋아하는 책 'Expert C Programming, Deep C Secrets - Peter Van Der Linden'에 언급되었는데, Sun에있는 한 단계에서 인쇄용 도구 인 'printtool'이 있었지만, 인쇄 스풀러 프로그램에서 메모리 누수가 있었고 Sun 컴퓨터를 다시 부팅하면 문제가 해결되어 대기열이 막혔습니다. 메모리 누수와 관련하여 자세히 설명합니다.

호프가 도움이 되었으면 안녕하세요, 탐.

1

오래된 Unix 응용 프로그램이 많이 메모리를 유출했고 프로세스 끝 정리에서 계산되었습니다. 그 당시의 제한된 주소 공간에서도 일반적으로 상당히 잘 작동했습니다. 물론 장기 실행 앱에서는 작동하지 않습니다. 디버깅 할 때 메모리 누수의 영향에 대해 걱정하지 않아도됩니다 (누수 자체가 버그이므로 릴리스 전에 제거하는 것이 좋습니다).

유닉스와 내가 실제로 알고있는 다른 모든 현재 OS는 OS가 메모리를 프로세스에 할당한다는 것은 일어난다. malloc() 메모리를 프로세스 메모리에서 빼내고 프로세스가 제공 할 수있는 것보다 많은 양을 묻는다면 OS에서 더 많은 프로세스 메모리를 요청할 것입니다. 프로그램에 메모리 누수가 발생하면 프로세스 메모리는 시스템에서 허용하는만큼 커질 수 있지만 모든 프로세스 메모리이므로 프로세스가 끝나면 모든 할당이 사라집니다.

종료 된 프로세스에서 메모리를 복구하지 못했지만 하나도 보지 못했거나 작업 한 적이없는 것으로 알고 있습니다. 상당수의 사람들이 사용하는 개인용 컴퓨터 (특수 목적 또는 엔터프라이즈 컴퓨터와 반대되는)의 유일한 OS는 Windows 및 Unix 변형이며 프로세스의 끝에서 모든 메모리를 릴리스합니다.

관련 문제