Loading...

EnterCriticalSection 사용할때 주의 할점

출처 : http://blog.naver.com/process3?Redirect=Log&logNo=20026509730 CriticalSection 은 vista 에서 데드락에 빠질 수 있습니다. 이 내용에 대해서 말씀 드리는 것은 아니에요 [문제 발생 원인] EnterCriticalSection 의 API 를 MSDN 에서 확인 해 보면 리턴값이 VOID 형 입니다. 즉, 이 함수를 호출한 후에 성공했는지 실패했는지 확인 할 수가 없습니다. 그리고 일반적으로 우리가 사용 할 때도 리턴값을 확인하지 않습니다. 그런데 만약에 시스템에 메모리가 low memory situations 상태 일 때(가용메모리가 부족 할 때) EnterCriticalSection 함수 호출한 곳에서 Exception 이 발생 합..

c++ 생각하기 3.

1. new, delete, operator new, operator delete, placement new new와 operator new의 차이? new의 동작은 메모리의 할당, 생성자를 호출하여 초기화 수행이다. operator new의 동작은 메모리의 할당. new 연산자는 우리가 바꿀 수 있는 부분이 아니다. 우리가 바꿀 수 있는 부분은 객체를 담을 메모리를 할당하는 방법 뿐이다. new 연산자는 메모리 할당을 위해 어떤 함수를 호출하는데 이 함수를 오버로딩 하는 것이다. 이것이 operator new이다. 즉 우리는 생성자까지 호출되어 초기화된 객체만을 받을 수 있는 것이다. 왜냐하면 객체는 딱 한번 초기화 될 수 있기 때문이다. 하지만 할당받은 미초기화 메모리가 있다면 이를 객체형태로 만들고..

winapi의 오류를 문자열로 출력하기.

win api의 실패시 오류값은 dword. 내부로 들어가보면 알수없는 숫자들이 많다. 이를 문자열로 전화해서 출력하기 위해 GetLastError으로 에러 숫자코드를 받아 FormatMessage를 사용하여 바꾸어 준다. #include void PrintError(DWORD dwErrorNo); ... void PrintError(DWORD dwErrorNo) { LPVOID lpMsgBuf; if (!FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwErrorNo, MAKELANGID(LANG_NEUTRAL, SUBLAN..

가변 인수를 가지는 함수 및 매크로 만들기

출처 : http://uuzazuk9.egloos.com/906491 ANSI C 버전 ================================================================================ #include #include int average(int first, ...); void main( void ) { /* Call with 3 integers (-1 is used as terminator). */ printf("Average is: %dn", average(2, 3, 4, -1)); /* Call with 4 integers. */ printf("Average is: %dn", average(5, 7, 9, 11, -1)); /* Call with jus..

c++ 생각하기 2.

1. 컴파일러가 스스로 하는 암시적인 타입변환. 단일인자 생성자를 통한 암시적 타입변환..... 이녀석의 때문에 생기는 버그는 찾기 어렵다. 미리미리 조심해야지. 단일인자 생성자의 경우에는 explicit 키워드를 사용하자. 하지만 이렇게 해도 명시적인 타입변환은 여전히 허용된다. 명시적인 타입변환까지 막을 필요가 있을까... 말그대로 사용자가 필요해서 대놓고 한다는데. 문제는 몰래하는 암시적변환이지만.... 또다른 방법으로는 컴파일러의 암시적 타입변환의 규칙을 교묘히 피해나가는 것이다. 즉, 컴파일러의 암시적 타입변환 규칙에 어긋나게 만드는 것이다. "사용자 정의 타입변환 함수는 두개 이상 쓰이지 않는다." 라는 것이 있다. 그래서 클래스만 잘 만들어 놓으면 객체생성은 허용하지만 암시적 타입변환은 불가..

dllimport, dllexport

exports library file(.exp), object file library(.lib) 참조 : msdn http://msdn.microsoft.com/ko-kr/library/se8y7dcs(VS.80).aspx .exp파일에는 export된 함수와 데이터 항목에 대한 정보가 들어있다. .lib에는 export할 함수를 만들때 .exp파일도 함께 만든다. 다른 프로그램으로 export 하거나 import하기도 하는 프로그램을 직접 또는 간접적으로 링크하고자 할 때 이 .exp 파일을 사용한다. .exp 파일을 사용하여 링크하면 link에서는 import 라이브러리를 이미 만들었다고 가정하기 때문에 다시 만들지 않는다. 이 파일들을 만드는 방법은 간단하다. #ifdef MGSYSTEM_EXPOR..

c++ 생각하기 1.

1. 프로퍼티 시트 활용 블로그에 이미 자료를 올렸으니 생략. 2. 참조자와 포인터 구분 사용 참조의 사용 - 참조하고자 하는 어떤 객체를 미리 알고 있을 때(참조자는 NULL이 될 수 없기 떄문) - 다른 객체를 바꾸어 참조할 일이 없을 때(포인터의 경우 하나의 변수를 가지고 여러개의 객체를 바꾸어 참조 가능) - 연산자 함수 구현시(예로 첨자 연산자[] 구현시 포인터를 사용하면 어색한 모습이 된다.) 포인터의 사용 - 딱히 가르킬 주소가 없을때(NULL을 사용 할 수 있다) - 하나의 변수로 여러객체를 바꾸어 참조하더라도 이전 객체의 값이 변하지 않는다. 여태까진 대부분 포인터를 즐겨 사용했다. 포인터를 사용하면 NULL로 초기화를 할 수 있어 초기화 여부를 체크 할 수 있기 때문이다. 참조자를 사용..

중복 없는 난수 만들기, 혹은 카드 섞기 문제

출처 : http://conanoc.egloos.com/1046677 최 모 주임이 점심시간에 제기했던 재미있는 문제를 조금 찾아봤습니다. 문제는 "1에서 100까지의 숫자를 중복 없이 랜덤하게 뽑아내라" 이며, 이 문제는 "1에서 100까지 숫자를 잘 섞어라" 와 동일하기도 합니다. 인터넷에서 찾아보니 대략 밥먹을때 이야기나왔던 것들과 비슷하고, 정리하고 보니 현 선임이 이야기했던 방법이 가장 효율적인것 같네요. 1) 우선, 가장 쉽게 생각할 수 있는 잘못된(?) 방법은 이런 방법일 겁니다. 중복 안된 숫자가 나올때 까지 계속 랜덤을 돌리는 것이지요. 물론 MAX가 20정도면 이 방법도 유효할 수 있겠습니다만, 별을 다섯개 줄만한 답변은 아닌것 같네요. 2) 그 다음 생각할 수 있는 방법은 숫자들을 배..