2010. 4. 29. 21:16

ZeroMemory


선행 학습이 필요합니다.
http://ekessy.tistory.com/10 C/C++에서의 일반변수, 포인터변수, 메모리에 대해
http://ekessy.tistory.com/11 memset, memcpy, memmove, memcmp 멤형제들



ZeroMemory의 원형에 가보면 다음과 같습니다.
#define ZeroMemory RtlZeroMemory

RtlZeroMemory의 원형에 가보면 다음과 같습니다.
#define RtlZeroMemory(Destination,Length) memset((Destination),0,(Length))

즉, 단순히 ZeroMemory는 memset를 활용한 전처리기 매크로일 뿐이라는 점입니다. 비슷한 예로 여러가지
더 있는데,
#define MoveMemory RtlMoveMemory
#define CopyMemory RtlCopyMemory
#define FillMemory RtlFillMemory
#define ZeroMemory RtlZeroMemory

들이 각각

#define RtlMoveMemory(Destination,Source,Length) memmove((Destination),(Source),(Length))
#define RtlCopyMemory(Destination,Source,Length) memcpy((Destination),(Source),(Length))
#define RtlFillMemory(Destination,Length,Fill) memset((Destination),(Fill),(Length))
#define RtlZeroMemory(Destination,Length) memset((Destination),0,(Length))

으로 정의되어있습니다.

다시 본론으로 들어가서, 아래와 같은 구조체가 있을 때,
struct Test
{
   int n;
   char c;
};


Test t;
ZeroMemory( &t, sizeof(t) );
//를 하게되면 컴파일시 자동으로 아래처럼 대체된단 얘기입니다.

Test t;
memset( &t, 0, sizeof(t) );



즉, t의 시작주소부터 t가 차지하는 바이트수까지 0으로 채워준다를 뜻합니다.

하지만 주의사항이 있는데요. D3DXMATRIX값이나 D3DXQUATERNION등은 값자체가 0이면 안되는 경우가 많고, STL의 경우 의도치않는 데이터(0으로 초기화시키면 안되는)가 0으로 초기화되기 때문에 항상 주의를 요합니다. 따라서 순수한 데이터만 가지고 있는 구조체의 인스턴스에 취하는 것이 적절하겠습니다.