(관리되지 않는) 코드에서 메모리 누수를 어떻게 감지 / 방지합니까? [닫은] 지식을 통해 답변이 뒷받침

관리되지 않는 C / C ++ 코드에서 메모리 누수를 감지하는 가장 좋은 방법은 무엇입니까? 코딩 지침은 피해야합니까? (그렇다면 간단합니다.)

우리는 과거에 약간의 어리석은 방식을 사용했습니다. 즉, 모든 메모리 할당 호출에 대해 카운터 증분을하고 해제하는 동안 감소합니다. 프로그램이 끝나면 카운터 값은 0이어야합니다.

나는 이것이 좋은 방법이 아니며 몇 가지 캐치가 있음을 알고 있습니다. (예를 들어, 플랫폼 API 호출에 의해 할당 된 메모리를 해제하는 경우 할당 계수는 해제 횟수와 정확히 일치하지 않습니다. 물론 메모리를 할당 한 API 호출을 호출 할 때 카운터를 증가 시켰습니다.)

나는 당신의 경험, 제안 및 이것을 단순화시키는 도구에 대한 언급을 기대하고 있습니다.



답변

C / C ++ 코드를 * nix로 이식 할 수있는 경우 Valgrind 보다 나은 점은 거의 없습니다 .


답변

Visual Studio를 사용하는 경우 Microsoft는 메모리 누수를 감지하고 디버깅하는 데 유용한 기능을 제공합니다.

이 기사로 시작하겠습니다 :
https://msdn.microsoft.com/en-us/library/x98tx3cf(v=vs.140).aspx

다음은 해당 기사에 대한 간략한 요약입니다. 먼저 다음 헤더를 포함하십시오.

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

그런 다음 프로그램이 종료 될 때 이것을 호출해야합니다.

_CrtDumpMemoryLeaks();

또는 매번 같은 장소에서 프로그램이 종료되지 않으면 프로그램 시작시이를 호출 할 수 있습니다.

_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

이제 프로그램이 종료되면 할당되지 않은 모든 할당이 할당 된 파일 및 할당 발생과 함께 출력 창에 인쇄됩니다.

이 전략은 대부분의 프로그램에서 작동합니다. 그러나 어떤 경우에는 어렵거나 불가능 해집니다. 시작시 일부 초기화를 수행하는 타사 라이브러리를 사용하면 메모리 덤프에 다른 개체가 표시되어 누출을 추적하기 어려울 수 있습니다. 또한 클래스에 메모리 할당 루틴 (예 : malloc)과 이름이 같은 멤버가있는 경우 CRT 디버그 매크로가 문제를 발생시킵니다.

위에서 참조한 MSDN 링크에 설명 된 다른 기술도 사용할 수 있습니다.


답변

C ++에서 : RAII를 사용하십시오. 스마트 포인터 좋아 std::unique_ptr, std::shared_ptr, std::weak_ptr친구입니다.


답변

C ++ 개발자는 다음과 같은 간단한 지침을 제공합니다.

  1. 꼭 필요한 경우에만 포인터를 사용하십시오
  2. 포인터가 필요한 경우 SmartPointer 가 가능한지 다시 확인하십시오.
  3. GRASP Creator 패턴을 사용하십시오 .

개인적으로 메모리 누수 감지에 대해서는 항상 Visual Leak Detector를 사용 했으며 매우 유용하다고 생각했습니다.


답변

지금까지 너무 오랫동안 DevStudio를 사용해 왔으며 디버그 런타임 라이브러리에서 사용할 수있는 메모리 분석 도구에 대해 얼마나 많은 프로그래머가 알지 못하는지 항상 놀랍습니다. 시작하는 몇 가지 링크는 다음과 같습니다.

힙 할당 요청 추적 -특히 고유 할당 요청 번호 섹션

_CrtSetDbgFlag

_CrtSetBreakAlloc

물론 DevStudio를 사용하지 않는다면 특별히 도움이되지 않습니다.


답변

Windows OS 용 DebugDiag 를 언급 한 사람이 아무도 없습니다 .
릴리스 빌드 및 고객 사이트에서도 작동합니다.
(릴리스 버전 PDB를 유지하고 Microsoft 공용 심볼 서버를 사용하도록 DebugDiag를 구성하면됩니다)


답변

Visual Leak Detector는 VC9 런타임 (예 : MSVCR90D.DLL)에서 호출을 지원하지 않지만 매우 유용한 도구입니다.