다음을 통해 공유


개체 덤프 해석

이 항목은 다음 언어에 적용됩니다.

Edition

Visual Basic

C#

F#

C++

Web Developer

Express

항목이 적용되지 않음 항목이 적용되지 않음 항목이 적용되지 않음

네이티브 전용

항목이 적용되지 않음

Pro, Premium 및 Ultimate

항목이 적용되지 않음 항목이 적용되지 않음 항목이 적용되지 않음

네이티브 전용

항목이 적용되지 않음

이 개체 덤프를 자세히 살펴보면 다음과 같습니다.

{5} strcore.cpp(80) : non-object block at $00A7521A, 9 bytes long
{4} strcore.cpp(80) : non-object block at $00A751F8, 5 bytes long
{3} strcore.cpp(80) : non-object block at $00A751D6, 6 bytes long
{2} a CPerson at $51A4

Last Name: Smith
First Name: Alan
Phone #: 581-0215

{1} strcore.cpp(80) : non-object block at $00A7516E, 25 bytes long

이 덤프를 생성한 프로그램에는 스택과 힙에 각각 하나씩 두 개의 명시적 할당이 있습니다.

// Do your memory allocations and deallocations.
CString s("This is a frame variable");
// The next object is a heap object.
CPerson* p = new CPerson( "Smith", "Alan", "581-0215" );

CPerson 생성자는 char의 포인터가 되는 세 인수를 가지며, 이들 인수는 CString 멤버 변수를 초기화하는 데 사용됩니다. 메모리 덤프에서 CPerson 개체와 세 개의 비개체 블록(3, 4, 5)을 볼 수 있습니다. 이들은 CString 멤버 변수 문자를 가지고 있으며 CPerson 개체 소멸자를 호출할 때 삭제되지 않습니다.

블록 번호 2는 CPerson 개체 자신입니다. $51A4는 블록 주소로서 다음에 개체 내용이 표시되며, 개체 내용은 DumpAllObjectsSince가 호출할 때 CPerson::Dump를 사용하여 출력됩니다.

블록 번호 1은 CString 프레임 변수와 연결되어 있다고 볼 수 있습니다. 해당 시퀀스 번호와 크기가 프레임 CString 변수에 있는 문자의 번호와 일치하기 때문입니다. 프레임이 범위를 벗어나면 프레임에 할당된 변수는 자동으로 할당 취소됩니다.

프레임 변수

프레임 변수가 범위를 벗어나면 할당이 자동으로 취소되기 때문에 프레임 변수와 연결된 힙 개체에 대해서는 신경쓸 필요가 없습니다. 메모리 진단 덤프의 혼란을 막으려면 Checkpoint 호출을 프레임 변수의 범위 밖에 배치해야 합니다. 예를 들어, 다음과 같이 이전 할당 코드를 범위 괄호로 묶어 주십시오.

oldMemState.Checkpoint();
{
    // Do your memory allocations and deallocations ...
    CString s("This is a frame variable");
    // The next object is a heap object.
    CPerson* p = new CPerson( "Smith", "Alan", "581-0215" );
}
newMemState.Checkpoint();

범위 괄호를 추가하면 이 예제의 메모리 덤프가 다음과 같이 표시됩니다.

Dumping objects ->

{5} strcore.cpp(80) : non-object block at $00A7521A, 9 bytes long
{4} strcore.cpp(80) : non-object block at $00A751F8, 5 bytes long
{3} strcore.cpp(80) : non-object block at $00A751D6, 6 bytes long
{2} a CPerson at $51A4

Last Name: Smith
First Name: Alan
Phone #: 581-0215

비개체 할당

일부 할당은 CPerson 과 같은 개체이며 일부는 비개체 할당입니다. 이때 비개체 할당"이란 CObject에서 파생되지 않은 할당이나 char, int 또는 long 등 기본 C 형식의 할당입니다. CObject 파생 클래스가 내부 버퍼와 같은 추가 공간을 할당하는 경우 해당 개체는 개체 할당과 비개체 할당을 모두 표시합니다.

메모리 누수 방지

위 코드에서, CString 프레임 변수와 연결된 메모리 블록은 자동으로 할당 취소되어 메모리 누수로 표시되지 않습니다. 범위 지정 규칙과 관련된 자동 할당 취소는 프레임 변수와 연결된 대부분의 메모리 누수에 적용됩니다.

그러나 힙에 할당된 개체는 명시적으로 삭제하여 메모리 누수를 방지해야 합니다. 이전 예제의 마지막 메모리 누수를 해결하려면 힙에 할당된 CPerson 개체를 다음과 같이 삭제하십시오.

{
    // Do your memory allocations and deallocations.
    CString s("This is a frame variable");
    // The next object is a heap object.
    CPerson* p = new CPerson( "Smith", "Alan", "581-0215" );
    delete p;
}

참고 항목

참조

_CrtMemDumpAllObjectsSince

개념

개체 덤프

기타 리소스

MFC에서 메모리 누수 탐지