다음을 통해 공유


CMemoryState 구조체

프로그램에서 메모리 누수 감지를 위한 편리한 방법을 제공합니다.

구문

struct CMemoryState

멤버

공용 생성자

속성 설명
CMemoryState::CMemoryState 메모리 검사포인트를 제어하는 클래스와 유사한 구조를 생성합니다.

공용 메서드

이름 설명
CMemoryState::Checkpoint 현재 메모리 상태의 스냅샷(검사point)를 가져옵니다.
CMemoryState::D ifference 형식 CMemoryState의 두 개체 간의 차이를 계산합니다.
CMemoryState::D umpAllObjectsSince 이전 검사 지점 이후 현재 할당된 모든 개체의 요약을 덤프합니다.
CMemoryState::D umpStatistics 개체에 대한 메모리 할당 통계를 CMemoryState 출력합니다.

설명

CMemoryState 는 구조체이며 기본 클래스가 없습니다.

개체의 메모리가 힙에 할당되었지만 더 이상 필요하지 않을 때 할당 취소되지 않을 때 "메모리 누수"가 발생합니다. 이러한 메모리 누수는 결국 메모리 부족 오류로 이어질 수 있습니다. 프로그램에서 메모리를 할당하고 할당을 취소하는 방법에는 여러 가지가 있습니다.

  • malloc/ free 런타임 라이브러리의 함수 패밀리 사용

  • Windows API 메모리 관리 함수 및 . LocalAlloc/ LocalFreeGlobalAlloc/ GlobalFree

  • C++ newdelete 연산자 사용

CMemoryState 이 진단 연산자를 사용하여 new 할당된 메모리가 할당 취소되지 않은 delete경우 발생하는 메모리 누수만 감지하는 데 도움이 됩니다. 메모리 관리 함수의 다른 두 그룹은 비 C++ 프로그램용이며 동일한 프로그램과 혼합하는 newdelete 것은 권장되지 않습니다. 메모리 할당의 파일 및 줄 번호 추적이 필요할 때 연산자를 new 대체하기 위해 추가 매크로 DEBUG_NEW 제공됩니다. DEBUG_NEW 일반적으로 연산자를 new 사용할 때마다 사용됩니다.

다른 진단 CMemoryState 마찬가지로 진단 프로그램의 디버그 버전에서만 사용할 수 있습니다. 디버그 버전에는 _DEBUG 상수가 정의되어야 합니다.

프로그램에 메모리 누수가 있다고 의심되는 경우 , Difference함수를 DumpStatistics 사용하여 Checkpoint프로그램 실행의 두 가지 지점에서 메모리 상태(할당된 개체)의 차이를 검색할 수 있습니다. 이 정보는 함수가 할당하는 모든 개체를 클린 여부를 결정하는 데 유용할 수 있습니다.

할당 및 할당 취소의 불균형이 발생하는 위치를 알면 충분한 정보를 제공하지 못하는 경우 이 함수를 DumpAllObjectsSince 사용하여 이전 호출 이후 할당된 모든 개체를 덤프할 Checkpoint수 있습니다. 이 덤프는 할당 순서, 개체가 할당된 원본 파일 및 줄(할당에 DEBUG_NEW 사용하는 경우) 및 개체의 파생, 해당 주소 및 크기를 보여줍니다. DumpAllObjectsSince 또한 각 개체의 Dump 함수를 호출하여 현재 상태에 대한 정보를 제공합니다.

사용 CMemoryState 방법 및 기타 진단 대한 자세한 내용은 MFC 애플리케이션 디버깅을 참조하세요.

참고 항목

형식 CMemoryState 의 개체 선언과 멤버 함수에 대한 호출은 지시문으로 #if defined(_DEBUG)/#endif 괄호로 묶어야 합니다. 이렇게 하면 메모리 진단 프로그램의 디버깅 빌드에만 포함됩니다.

상속 계층 구조

CMemoryState

요구 사항

헤더: afx.h

CMemoryState::Checkpoint

메모리의 스냅샷 요약을 사용하여 이 CMemoryState 개체에 저장합니다.

void Checkpoint();

설명

멤버 함수 DifferenceDumpAllObjectsSinceCMemoryState 이 스냅샷 데이터를 사용합니다.

예시

CMemoryState 생성자에 대한 예제를 참조하세요.

CMemoryState::CMemoryState

Checkpoint 또는 Difference 멤버 함수로 채워야 하는 빈 CMemoryState 개체를 생성합니다.

CMemoryState();

예시

CMemoryState msOld;
msOld.Checkpoint();
CPerson* pper1 = new CPerson();
CPerson* pper2 = new CPerson();
msOld.DumpAllObjectsSince();

CMemoryState::D ifference

CMemoryState 개체를 비교한 다음 이 개체에 CMemoryState 차이를 저장합니다.

BOOL Difference(
    const CMemoryState& oldState,
    const CMemoryState& newState);

매개 변수

oldState
검사point에서 정의한 CMemoryState 초기 메모리 상태입니다.

newState
검사point에서 정의한 CMemoryState 새 메모리 상태입니다.

Return Value

두 메모리 상태가 다른 경우 0이 아닌 경우 그렇지 않으면 0입니다.

설명

두 메모리 상태 매개 변수 각각에 대해 검사점 이 호출되어야 합니다.

예시

CMemoryState 생성자에 대한 예제를 참조하세요.

CMemoryState::D umpAllObjectsSince

DumpCMemoryState 개체에 대한 마지막 검사점 호출 이후 할당되고 여전히 할당된 클래스 CObject 에서 파생된 형식의 모든 개체에 대한 함수를 호출합니다.

void DumpAllObjectsSince() const;

설명

초기화 CMemoryState 되지 않은 개체를 사용하여 호출 DumpAllObjectsSince 하면 현재 메모리에 있는 모든 개체가 덤프됩니다.

예시

CMemoryState 생성자에 대한 예제를 참조하세요.

CMemoryState::D umpStatistics

Difference 멤버 함수로 채워진 개체에서 CMemoryState 간결한 메모리 통계 보고서를 인쇄합니다.

void DumpStatistics() const;

설명

afxDump 디바이스에 인쇄되는 보고서에는 다음이 표시됩니다.

샘플 보고서는 다음의 수(또는 양)에 대한 정보를 제공합니다.

  • 자유 블록

  • 일반 블록

  • CRT 블록

  • 블록 무시

  • 클라이언트 블록

  • 프로그램에서 한 번에 사용하는 최대 메모리(바이트)

  • 프로그램에서 현재 사용하는 총 메모리(바이트)

자유 블록은 할당 취소가 설정된 delayFreeMemDF경우 afxMemDF 지연된 블록의 수입니다. 자세한 내용은 "MFC 매크로 및 전역" 섹션에서 afxMemDF를 참조하세요.

예시

다음 코드는 projnameApp.cpp에 배치해야 합니다. 다음 전역 변수를 정의합니다.

static CMemoryState oldstate, newstate, diffstate;

함수에서 InitInstance 다음 줄을 추가합니다.

oldstate.Checkpoint();

함수에 대한 ExitInstance 처리기를 추가하고 다음 코드를 사용합니다.

newstate.Checkpoint();
if (diffstate.Difference(oldstate, newstate))
{
   TRACE(_T("Memory leaked\n"));
   diffstate.DumpStatistics();
}

이제 디버그 모드에서 프로그램을 실행하여 함수의 DumpStatistics 출력을 볼 수 있습니다.

참고 항목

계층 구조 차트