CMemoryState 구조체
프로그램에서 메모리 누수 감지를 위한 편리한 방법을 제공합니다.
구문
struct CMemoryState
멤버
공용 생성자
속성 | 설명 |
---|---|
CMemoryState::CMemoryState | 메모리 검사점을 제어하는 클래스와 유사한 구조를 생성합니다. |
공용 메서드
이름 | 설명 |
---|---|
CMemoryState::Checkpoint | 현재 메모리 상태의 스냅샷(검사점)을 가져옵니다. |
CMemoryState::D ifference | 형식 CMemoryState 의 두 개체 간의 차이를 계산합니다. |
CMemoryState::D umpAllObjectsSince | 이전 검사점 이후 현재 할당된 모든 개체의 요약을 덤프합니다. |
CMemoryState::D umpStatistics | 개체에 대한 메모리 할당 통계를 CMemoryState 출력합니다. |
설명
CMemoryState
는 구조체이며 기본 클래스가 없습니다.
개체의 메모리가 힙에 할당되었지만 더 이상 필요하지 않을 때 할당 취소되지 않을 때 "메모리 누수"가 발생합니다. 이러한 메모리 누수는 결국 메모리 부족 오류로 이어질 수 있습니다. 프로그램에서 메모리를 할당하고 할당을 취소하는 방법에는 여러 가지가 있습니다.
malloc
/free
런타임 라이브러리의 함수 패밀리 사용Windows API 메모리 관리 함수 및 .
LocalAlloc
/LocalFree
GlobalAlloc
/GlobalFree
C++
new
및delete
연산자 사용
진단은 CMemoryState
연산자를 사용하여 할당된 메모리가 다음을 사용하여 new
delete
할당 취소되지 않은 경우 발생하는 메모리 누수를 감지하는 데만 도움이 됩니다. 메모리 관리 함수의 다른 두 그룹은 비 C++ 프로그램용이며 동일한 프로그램과 혼합하는 new
delete
것은 권장되지 않습니다. 메모리 할당의 파일 및 줄 번호 추적이 필요할 때 연산자를 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();
설명
CMemoryState
멤버 함수 Difference 및 DumpAllObjectsSince는 이 스냅샷 데이터를 사용합니다.
예시
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
검사점에서 정의 CMemoryState
한 초기 메모리 상태입니다.
newState
검사점에서 정의 CMemoryState
한 새 메모리 상태입니다.
Return Value
두 메모리 상태가 다른 경우 0이 아닌 경우 그렇지 않으면 0입니다.
설명
두 메모리 상태 매개 변수 각각에 대해 검사점 이 호출되어야 합니다.
예시
CMemoryState 생성자에 대한 예제를 참조하세요.
CMemoryState::D umpAllObjectsSince
Dump
이 CMemoryState
개체에 대한 마지막 검사점 호출 이후 할당되고 여전히 할당된 클래스 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
출력을 볼 수 있습니다.