다음을 통해 공유


CRT 어설션

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

Edition

Visual Basic

C#

F#

C++

Web Developer

Express

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

네이티브 전용

항목이 적용되지 않음

Pro, Premium 및 Ultimate

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

네이티브 전용

항목이 적용되지 않음

CRTDBG.H 헤더 파일에서 _ASSERT 및 _ASSERTE 매크로를 정의하여 어설션을 확인합니다.

매크로

결과

_ASSERT

지정된 식이 FALSE로 계산될 경우, 결과 값은 _ASSERT의 파일 이름과 줄 번호입니다.

_ASSERTE

_ASSERT와 마찬가지이며, 여기에 어설션된 식의 문자열 표시가 추가됩니다.

_ASSERTE는 결과 값이 FALSE인 어설션된 식을 보고하기 때문에 보다 효과적입니다. 따라서 소스 코드를 참조하지 않고도 문제를 식별할 수 있습니다. 그러나 응용 프로그램의 디버그 버전에는 _ASSERTE로 어설션된 식마다 문자열 상수가 포함됩니다. _ASSERTE 매크로를 많이 사용하면 이러한 문자열 식이 메모리를 많이 차지합니다. 문제가 생기면 _ASSERT를 사용하여 메모리를 절약하십시오.

_DEBUG를 정의하면 _ASSERTE 매크로가 다음과 같이 정의됩니다.

#define _ASSERTE(expr) \
   do { \
      if (!(expr) && (1 == _CrtDbgReport( \
         _CRT_ASSERT, __FILE__, __LINE__, #expr))) \
         _CrtDbgBreak(); \
   } while (0)

어설션된 식이 FALSE로 계산되면 _CrtDbgReport가 호출되어 어설션 오류를 보고합니다(기본적으로 메시지 대화 상자 사용). 메시지 대화 상자에서 다시 시도를 선택하면 _CrtDbgReport가 1을 반환하고 _CrtDbgBreakDebugBreak를 통해 디버거를 호출합니다.

printf 바꾸기

예제 코드

#ifdef _DEBUG
   if ( someVar > MAX_SOMEVAR )
      printf( "OVERFLOW! In NameOfThisFunc( ),
               someVar=%d, otherVar=%d.\n",
               someVar, otherVar );
#endif

_ASSERTE를 사용하면 위의 코드를 다음과 같은 단일 문으로 바꿀 수 있습니다.

_ASSERTE(someVar <= MAX_SOMEVAR);

힙 손상 확인

다음 예제에서는 _CrtCheckMemory를 사용하여 힙 손상을 확인합니다.

_ASSERTE(_CrtCheckMemory());

포인터 유효성 확인

다음 예제에서는 _CrtIsValidPointer를 사용하여 지정한 메모리 범위가 읽기나 쓰기에 적합한지 확인합니다.

_ASSERTE(_CrtIsValidPointer( address, size, TRUE );

다음 예제에서는 _CrtIsValidHeapPointer를 사용하여 로컬 힙에서 포인터가 메모리를 가리키는지 확인합니다. 이때 로컬 힙이란 이러한 C 런타임 라이브러리의 인스턴스가 만들고 관리하는 힙, 즉 DLL에는 라이브러리의 자체 인스턴스가 있으므로 응용 프로그램 힙 외부에 있는 자체 힙을 의미합니다. 이 어설션은 null이나 범위를 벗어나는 주소 뿐만 아니라 정적 변수, 스택 변수 및 다른 모든 비 로컬 메모리에 대한 포인터를 찾아 냅니다.

_ASSERTE(_CrtIsValidPointer( myData );

메모리 블록 확인

다음 예제에서는 _CrtIsMemoryBlock을 사용하여 메모리 블록이 로컬 힙에 있고 블록 형식이 유효한지 확인합니다.

_ASSERTE(_CrtIsMemoryBlock (myData, size, &requestNumber, &filename, &linenumber));

참고 항목

개념

어설션