문제

방금 C ++에서 SDL을 실험하기 시작했으며 정기적으로 메모리 누출을 확인하는 것이 조기에 형성하기에 좋은 습관이라고 생각했습니다.

이것을 염두에두고, 나는 Valgrind를 통해 'Hello World'프로그램을 운영하여 누출을 잡았으며, 가장 기본적인 것을 제외한 모든 것을 제거했지만 SDL_Init() 그리고 SDL_Quit() 진술, Valgrind는 여전히 120 바이트 손실을보고하고 77k는 여전히 도달 할 수 있다고보고합니다.

내 질문은 : 메모리 누출에 대한 허용 가능한 한계가 있습니까, 아니면 모든 코드가 완전히 누출되지 않도록 노력해야합니까?

도움이 되었습니까?

해결책

Valgrind가 측정에서 잘못된 긍정적 인 긍정을 선택하지 않도록주의하십시오.

메모리 분석기의 많은 순진한 구현은 실제로 그렇지 않은 경우 메모리를 누출로 잃어 버렸습니다.

어쩌면 외부 링크 섹션에서 일부 논문을 읽었을 수도 있습니다. Purify에 관한 Wikipedia 기사. Purify와 함께 제공되는 문서는 메모리 누출을 감지하려고 할 때 잘못된 양성을 얻은 다음 Purify가 문제를 해결하기 위해 사용하는 기술을 설명하는 몇 가지 시나리오를 설명합니다.

BTW 나는 어떤 식 으로든 IBM과 제휴하지 않습니다. 방금 Purify를 광범위하게 사용했으며 그 효과를 보증 할 것입니다.

편집 : 여기에 있습니다 훌륭한 입문 기사 메모리 모니터링 커버. 그것은 구체적이지만 메모리 오류 유형에 대한 논의는 매우 흥미 롭습니다.

HTH.

건배,

다른 팁

"메모리 누출"의 정의에주의해야합니다. 처음 사용하면 한 번 할당되고 프로그램 출구에 해제되는 것은 때때로 누출 감지기에 의해 표시됩니다. 왜냐하면 처음 사용하기 전에 계산하기 시작했기 때문입니다. 그러나 그것은 누출이 아닙니다 (그것은 일종의 글로벌이기 때문에 디자인이 좋지 않을 수 있지만).

주어진 코드 덩어리가 누출되는지 여부를 확인하려면 합리적으로 한 번 실행 한 다음 누출 검출기를 제거한 다음 다시 실행할 수 있습니다 (물론 누출 감지기의 프로그래밍 방식 제어가 필요합니다). 프로그램의 실행 당 한 번 "누출"하는 것은 일반적으로 중요하지 않습니다. 그들이 처형 할 때마다 "누출"하는 것들이 일반적으로 결국 중요합니다.

나는이 메트릭에서 0을 누르는 것이 너무 어렵다는 것을 거의 발견하지 못했습니다. 나는 캐시와 UI 가구와 그 밖에 없어서 너무 어리석게 도서관을 가지고 있었기 때문에 테스트 스위트를 세 번 뛰었고 세 블록의 배수로 발생하지 않는 "누출"을 무시했습니다. 나는 여전히 실제 누출을 모두 잡았고, 낮은 금융 과일을 얻지 못하면 까다로운 보고서를 분석했습니다. 물론이 목적으로 테스트 스위트를 사용하는 약점은 (1) 새 프로세스가 필요없는 부분 만 사용할 수 있으며 (2) 대부분의 누출은 테스트 코드의 결함입니다. , 라이브러리 코드가 아닙니다 ...

메모리 누출 (및 기타 부주의 한 문제)으로 생활하는 것은 (내 의견으로는) 매우 나쁜 프로그래밍입니다. 최악의 경우 소프트웨어를 사용할 수 없습니다.

당신은 처음에 그것들을 소개하지 않고 당신과 다른 사람들이 그들을 감지하려고 언급 한 도구를 실행해야합니다.

조잡한 프로그래밍을 피하십시오 - 이미 충분한 나쁜 프로그래머가 있습니다. 세상에는 다른 것이 필요하지 않습니다.

편집하다

동의합니다. 많은 도구가 잘못된 양성을 제공 할 수 있습니다.

메모리 유출에 대해 정말로 걱정이되면 계산을 수행해야합니다.

응용 프로그램을 1 시간 동안 테스트 한 다음 유출 된 메모리를 계산해야합니다. 이런 식으로, 당신은 유출 된 메모리 바이트/분 값을 얻습니다.

이제 프로그램 세션의 평균 길이를 추정해야합니다. 예를 들어, Notepad.exe의 경우 15 분은 나에게 좋은 추정처럼 들립니다.

만약에 (평균 세션 길이) * (누출 바이트 / 분)> 0.3 * (일반적으로 프로세스가 차지하는 메모리 공간), 그러면 메모리 누출을 줄이기 위해 더 많은 노력을 기울여야 할 것입니다. 방금 0.3을 구성하고 상식을 사용하여 허용되는 임계 값을 결정합니다.

프로그래머가되는 것의 중요한 측면은 소프트웨어 엔지니어가되며, 종종 엔지니어링은 두 개 이상의 나쁜 옵션 중에서 가장 최악의 옵션을 선택하는 것입니다. 옵션이 실제로 얼마나 나쁜지 측정해야 할 때 수학은 항상 편리합니다.

데스크탑 응용 프로그램의 경우 작은 메모리 누출이 실제 문제가 아닙니다. 서비스 (서버)의 경우 메모리 누출이 허용되지 않습니다.

대부분의 OS (Windows 포함)는 프로그램이 언로드 될 때 모든 프로그램의 할당 된 메모리를 돌려줍니다. 여기에는 프로그램 자체가 추적을 잃어버린 메모리가 포함됩니다.

그 점을 감안할 때, 나의 일반적인 이론은 스타트 업 동안 메모리 누출이 완벽하다는 것입니다. ~ 아니다 런타임 중에는 가능합니다.

그래서 실제로 질문은 당신이 유출되는 경우가 아닙니다 어느 메모리, 프로그램 런타임 중에 지속적으로 누출되는 경우입니다. 만약 너라면 사용 당신의 프로그램은 잠시 동안, 그리고 당신이 무엇을하는지에 관계없이 증가하지 않고 120 바이트를 잃어 버렸습니다. 계속 움직입니다.

응용 프로그램에 따라 다릅니다. 누출 대 마감일을 찾는 데 필요한 시간으로 인해 일부 누출은 피할 수 없을 수 있습니다. 응용 프로그램이 원하는만큼 실행될 수있는 한, 그 당시에는 미친 메모리를 취하지 않을 것입니다. 아마 괜찮을 것입니다.

SDL 개발자가 Valgrind를 사용하지 않는 것처럼 보이지만 기본적으로 손실 된 120 바이트에만 관심이 있습니다.

이것을 염두에두고, 나는 Valgrind를 통해 'Hello World'프로그램을 운영하여 누출을 잡았으며, 가장 기본적인 sdl_init () 및 sdl_quit () 문을 제외한 모든 것을 제거했지만 Valgrind는 여전히 120 바이트가 손실되고 120 바이트를 잃어 버렸습니다. 77K는 여전히 도달 할 수 있습니다.

Valgrind를 사용하면 "여전히 도달 가능한 메모리"는 종종 간단한 프로그램에서 실제로 메모리가 유출되지 않습니다. 기본적으로 sdl_quit ()에 할당이 없다고 안전하게 베팅 할 수 있으므로 "누출"은 sdl_init ()에 의해 한 번만 할당 된 구조 일뿐입니다.

유용한 작업을 추가하고 해당 금액이 증가하는지 확인하십시오. SDL 구조를 만들고 파괴하는 것과 같은 유용한 작업을 루프하고 반복량에 따라 누출량이 증가하는지 확인하십시오. 후자의 경우 누출의 스택 흔적을 확인하고 고정해야합니다.

그렇지 않으면,이 77k 누출은 "프로그램 끝에서 해방되어야하는 메모리로 간주되지만,이를 위해 OS를 자유롭게 해방시킨다.

따라서 실제로, 나는 그들이 잘못된 긍정적이지 않다면 120 바이트에 의해 지금 더 걱정되며, 일반적으로 적은 양이 적습니다. Valgrind를 사용한 잘못된 양성은 주로 초기화되지 않은 기억의 사용이 의도되는 경우 (예 : 실제로 패딩이기 때문에).

Purify에 대한 Rob Wells의 의견에 따라 다른 도구 중 일부를 다운로드하여 시험해보십시오. 나는 BoundSchecker와 AQTIM을 사용하고 있으며 수년 동안 다른 잘못된 긍정을 보았습니다. 메모리 누출은 또한 타사 구성 요소에있을 수 있으며 분석에서 제외 할 수 있습니다. 예를 들어, MFC는 첫 번째보기 버전에서 다수의 메모리 누출을 가졌다.

IMO, Memory Leaks는 긴 수명을 가질 수있는 코드 기반으로 들어가는 모든 코드에 대해 추적해야합니다. 추적 할 수 없다면 적어도 동일한 코드의 다음 사용자에게 존재한다는 점을 확인하십시오.

첫 번째 메모리 누출은 시간이 지남에 따라 성장할 때 심각한 문제 일뿐입니다. 그렇지 않으면 앱이 외부에서 조금 더 크게 보입니다 (분명히 여기서도 '심각한'이기도합니다). 시간이 지남에 따라 자라는 누출이 있으면 곤경에 처할 수 있습니다. 그러나 얼마나 많은 문제가 상황에 따라 다릅니다. 만약 너라면 알다 메모리가 진행되는 경우 프로그램을 실행하기에 항상 충분한 메모리를 가질 수 있으며 해당 기계의 다른 모든 것을 여전히 다소 괜찮습니다. 그러나 메모리가 어디로 가고 있는지 모른다면 프로그램을 배송하지 않고 계속 파고 들지 않습니다.

특히 Linux의 SDL을 사용하면 기본 X Windows 라이브러리에는 약간의 누출이있는 것 같습니다. 그에 대해 할 수있는 일은 없습니다 (라이브러리 자체를 고치려고하지 않는 한, 아마도 희미한 마음이 아닐 것입니다).

Valgrind의 억제 메커니즘 (Valgrind Man 페이지의-억제 및-그운 억제 참조)을 사용하여 이러한 오류로 귀찮게하지 말라고 말할 수 있습니다.

일반적으로 우리는 타사 라이브러리와 조금 더 관대해야합니다. 우리는 우리 자신의 코드에서 메모리 누출을 절대적으로 받아 들여서는 안되며, 대체 제 3 자 라이브러리 중에서 선택할 때 메모리 누출이 존재하는 것이 요인이되어야하지만 때로는 선택권이 없지만 무시할 수는 없습니다 (이를보고하는 것이 좋습니다. 도서관 관리자에게).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top