C++ Language 3

typeid 를 이용한 실시간 타입 알아내기

#include #include class myclass { }; void main() { int a, b; char c; myclass ob1; printf("%s %s %s\n", typeid(a).name(), typeid(b).name() , typeid(c).name()); printf("%s\n", typeid(ob1).name()); bool isTrue = ( typeid(a) == typeid(b) ); // true } 컴파일 옵션에는 Enable Run-time type information (런타임 형식 정보 사용) 이 체크되어 있어야 함. 자세한 사항은 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/..

Windows Programming 2008.02.14

#File Error#

#File Error# 1.요약 프로그램이 끝날 때 메모리 릭이 난 부분은 가르쳐주는 거 아시죠? 근데 거기에 파일이름이 #File Error# 이라고 나오는 경우가 있습니다. 2.본문 우선은 누가 친절하게 메모리 릭을 잡아주느냐를 알아봐야겠죠. CRT의 디버그 힙이 바로 그 일을 해줍니다. 즉 메모리 할당할 당시에 ( new, malloc 문장) 그 라인 번호와 파일 이름을 CRT 자체적으로 어딘가에 저장하고 있는데, 그곳이 망가져버리거나 쓸 수 없게 되어버리면 #File Error# 이라고 대신해서 나온답니다. 우선 망가지는 경우로는 누군가가 그곳을 overwrite 해버리는 경우가 있겠고, 정말 있어서는 안될 일이겠습니다. 다음으로 우리에게 일어날 수 있는 시나리오로, dll 에서 할당한 메모리를 ..

Windows Programming 2008.02.12

regsvr32 를 하다가 죽을 때

ocx 가 메인이고, dll 들을 곁가지로 같이 갖고 있는 솔루션이 있다. 어느 순간 갑자기 빌드 마지막에 Debug Assert 가 일어나 버렸다. 황당했다. 프로그램 실행시도 아니고 빌드후에 regsvr32 를 하는 도중에 저런게 뜨다니... 이런 상황은 이전에도 많이 경험했다. 주로, dll 내의 DllRegisterServer 쪽의 코드가 잘못됐을 때, 혹은 ocx 의 InitInstance() 함수가 잘못 됐을 때 일어난다. 그런데, 오늘 겪은 상황은 모두 해당 사항 없음이다. 결국 문제를 발견했는데 원인은 잘 모르겠다. 문제는 dll 의 헤더에 멤버변수 하나를 추가한 것 뿐이다. 이상하다. 멤버변수를 추가해서 다시 컴파일 하고 lib 도 링크되고, dll 도 복사되고 하는데 왜 이런일이... ..

Windows Programming 2008.01.31