주요 콘텐츠로 건너뛰기 이 브라우저는 더 이상 지원되지 않습니다. Show 최신 기능, 보안 업데이트, 기술 지원을 이용하려면 Microsoft Edge로 업그레이드하세요. CRT 라이브러리로 메모리 누수 찾기
이 문서의 내용적용 대상: Visual Studio Mac용 Visual Studio Visual Studio Code메모리 누수는 C/C++ 앱에서 가장 복잡하고 감지하기 어려운 버그 중 하나입니다. 이전에 할당된 메모리를 올바르게 할당 해제하지 못하면 메모리 누수가 발생합니다. 소량의 메모리 누수는 처음에는 알아차리지 못하지만 시간이 지남에 따라 앱의 메모리가 부족해지면 성능 저하에서 충돌에 이르기까지 다양한 증상이 발생할 수 있습니다. 누수 앱이 사용 가능한 메모리를 모두 소진하여 다른 앱에서 충돌이 발생하면 문제의 책임이 있는 앱을 파악하기가 어려워질 수 있습니다. 무해한 메모리 누수조차도 해결해야 하는 다른 문제를 나타낼 수 있습니다. Visual Studio 디버거와 CRT(C 런타임 라이브러리)를 사용하면 메모리 누수를 감지하고 식별할 수 있습니다. 메모리 누수 감지 기능 사용메모리 누수를 감지하기 위한 기본 도구는 C/C++ 디버거와 CRT(C 런타임 라이브러리) 디버그 힙 함수입니다. 모든 디버그 힙 함수를 사용하려면 다음 순서대로 C++ 프로그램에 다음 명령문을 포함시킵니다.
crtdbg.h를 포함하면 위의 명령문을 사용하여 디버그 힙 함수를 사용하도록 설정한 후에는 앱 종료 지점 앞에 _CrtDumpMemoryLeaks를 호출하여 앱이 종료될 때 메모리 누수 보고서를 표시합니다.
앱이 여러 번 종료되는 경우 모든 종료 지점에
기본적으로 다음과 같이 표시된 것처럼
메모리 누수 보고서 해석앱에서
앱에서
두 번째 보고서에는 누수된 메모리가 처음 할당된 파일 이름 및 줄 번호가 표시됩니다.
메모리 블록 형식은 일반, 클라이언트 또는 CRT입니다. 표준 블록 은 프로그램이 할당한 보통 메모리입니다. 클라이언트 블록 은 MFC 프로그램이 소멸자를 필요로 하는 개체에 대해 사용하는 특별한 메모리 블록 형식입니다. MFC CRT 블록 은 CRT 라이브러리가 자체 용도에 맞게 할당한 메모리 블록입니다. CRT 라이브러리는 이러한 블록의 할당 취소를 처리하므로 CRT 라이브러리에 심각한 문제가 없는 한 메모리 누수 보고서에 CRT 블록이 나타나지 않습니다. 그 외에도 메모리 누수 보고서에 표시되지 않는 두 가지 메모리 블록 형식이 있습니다. 빈 블록은 릴리스된 메모리이므로 정의에 따라 유출되지 않습니다. 무시 블록은 메모리 누수 보고서에서 제외하도록 사용자가 명시적으로 지정한 메모리입니다. 위의 기술은 표준 CRT
이제 코드에서
Visual Studio 디버거에서 이 코드를 실행하면
이 출력은 유출된 할당이 debug_new.cpp의 20번째 줄에 있음을 보고합니다. 참고
메모리 할당 번호에 중단점 설정메모리 할당 번호는 누수된 메모리 블록이 할당된 시기를 알려 줍니다. 예를 들어 메모리 할당 번호가 18인 블록은 앱 실행 도중 18번째로 할당된 메모리 블록입니다. CRT 보고서는 CRT 라이브러리 및 MFC와 같은 다른 라이브러리에 의한 할당을 포함하여 실행 중에 모든 메모리 블록 할당을 계산합니다. 따라서 메모리 할당 블록 번호 18은 코드에서 18번째로 할당된 메모리 블록이 아닐 수도 있습니다. 할당 번호를 사용하여 메모리 할당에 중단점을 설정할 수 있습니다. 조사식 창을 사용하여 메모리 할당 중단점을 설정하려면
메모리 할당 번호에 중단점을 설정한 후 디버깅을 계속합니다. 메모리 할당 번호가 변경되지 않도록 동일한 조건으로 실행해야 합니다. 지정된 메모리 할당에서 프로그램이 중단되면 호출 스택 창과 다른 디버거 창을 사용하여 메모리가 할당된 조건을 확인합니다. 그런 다음, 실행을 계속하여 개체에 발생한 상황을 살펴보고 메모리가 올바르게 할당 해제되지 않은 원인을 확인할 수 있습니다. 개체에 데이터 중단점을 설정하는 것도 유용합니다. 자세한 내용은 중단점 사용을 참조하세요. 코드에서 메모리 할당 중단점을 설정할 수도 있습니다. 다음과 같이 설정할 수 있습니다.
또는
메모리 상태 비교주요 지점에서 애플리케이션의 메모리 상태 스냅샷을 보고 메모리 누수를 찾을 수도 있습니다. 애플리케이션의 지정된 지점에서 메모리 상태 스냅샷을 만들려면
코드의 한 섹션에서 메모리 누수가 발생했는지 확인하려면 해당 섹션 앞뒤에서 메모리 상태 스냅샷을 만든 다음
메모리 누수를 찾는 한 가지 기술은 앱의 처음과 마지막에 가양성(false positive)라이브러리에서 내부 할당을 CRT 블록 또는 클라이언트 블록 대신 일반 블록으로 표시하는 경우 참조
추가 리소스추가 리소스이 문서의 내용 |