LPVOID type은 Microsoft에서 정의한 type으로 Windows Kits 8.1 version의 WTypebase.h에 정의된 바로는

void *LPVOID;

로 정의되어 있다.

고로 LPVOID는 void *와 같은 타입이다.

위의 코드에서 마지막 주석의 이유는 다음과 같다.

stackoverflow.com/questions/2709283/c-delete-static-castvoid-pointer-behavior

 

C++ delete static_cast<void*> (pointer) behavior</void*>

suppose the code does the following: T *pointer = new T(); delete static_cast<void*>(pointer); what is result? Undefined, memory leak, memory is deleted?</void*>

stackoverflow.com

내용을 요약하면 C++ 표준에서는 void * 타입을 직접 delete하면 미정의 동작으로 직행한다.

그 이유는 void *는 간접 참조를 할 수 없기 때문이다.

간접 참조란 C/C++에서 포인터가 가리키는 메모리 주소의 값을 획득하는 것을 말한다.

void *이 간접 참조를 할 수 없는 이유는 시스템 마다 자료형에 차이가 나서이다.
(32비트 컴퓨터에서의 long은 4바이트, 64비트 컴퓨터에서의 long 타입은 8바이트)

컴파일러가 얼마나 많은 바이트를 읽어야 할지 모르기 때문에 void *는 간접 참조가 불가능하다.

마찬가지로 void *는 가리키는 메모리 주소에서 필요한 객체에 할당된 메모리 크기를 알 수 없다.

그러므로 void *를 직접 delete 할 수 없다.

 

void * 타입의 delete를 위해서는 casting을 하거나, void *가 아닌 공통의 Interface 또는 class 타입으로 바꾸는게 좋다.

+ Recent posts