나는 메모리 풀을 구현할 때 다음과 같이 구현했다.
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을 하게 만드는 순환이 발생하게 된 것이였다.
이를 해결하려면 new 대신 크기로 메모리를 할당하는 전역 new나 malloc을 사용해주면 된다.
'C++ > 트러블슈팅' 카테고리의 다른 글
0xc0000005 ReadFile() 애러 해결 (2) | 2024.01.14 |
---|