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++ 표준에서는 void * 타입을 직접 delete하면 미정의 동작으로 직행한다.
그 이유는 void *는 간접 참조를 할 수 없기 때문이다.
간접 참조란 C/C++에서 포인터가 가리키는 메모리 주소의 값을 획득하는 것을 말한다.
void *이 간접 참조를 할 수 없는 이유는 시스템 마다 자료형에 차이가 나서이다.
(32비트 컴퓨터에서의 long은 4바이트, 64비트 컴퓨터에서의 long 타입은 8바이트)
컴파일러가 얼마나 많은 바이트를 읽어야 할지 모르기 때문에 void *는 간접 참조가 불가능하다.
마찬가지로 void *는 가리키는 메모리 주소에서 필요한 객체에 할당된 메모리 크기를 알 수 없다.
그러므로 void *를 직접 delete 할 수 없다.
void * 타입의 delete를 위해서는 casting을 하거나, void *가 아닌 공통의 Interface 또는 class 타입으로 바꾸는게 좋다.