C++/트러블슈팅

나는 메모리 풀을 구현할 때 다음과 같이 구현했다.static T* Pop(){ T* ptr = nullptr; if (!m_pool.empty()) ptr = m_pool.pop(); else ptr = new T; return ptr;}하지만 Pop을 호출하는 순간 엄청난 new의 콜스택이 쌓여 스택 오버플로우가 발생했다. 아무리 생각해도 new가 new를 호출할 일이 뭐가 있지 싶었지만, 얼마 지나지 않아 이유를 찾았다.바로 내가 풀링을 구현한 방식 때문이였다. 클래스에서 매크로를 사용해 new를 오버로딩하게 만들어 new를 호출할 때 오브젝트 풀에서 Pop을 호출하게 하는 식으로 구현했다.ptr = new T;그래서 이 코드에서 또 new를 호출하고 Pop을 하게 만..
서버를 개발하던 중 갑자기 kernalbase.dll에서 애러가 떴다. 필자는 분명 커널에서 애러가 났고, 커널이 관리하는 IOCP에서 비동기 Accept동작을 걸었으니 여기서 애러가 난 것이라 생각했다. 하지만 이것은 반은 맞았고 반은 틀린 생각이였다. 놀랍게도 애러는 바로 getchar에서 일어난 것이였다. 비동기 작업을 걸기 전 io처리 스레드(GQSC; GetQueuedCompletionStatus()가 있는 스레드)가 커널모드에서 활성화 되지 않은 상태에서 주 스레드가 terminated되었을 땐 문제가 발생하지 않았다. 문제가 발생하는 상황은 비동기 작업을 걸어 io처리 스레드가 활성화 되고, 아무 문자를 입력해 main스레드에서 getchar를 실행하게 되었다. 하지만 getchar는 thr..
index1207
'C++/트러블슈팅' 카테고리의 글 목록