https://hyrule.tistory.com/111
*** 공부 방법 ***
1. 코딩을 해야 하는 부분은 첫 부분에 변수나 함수, 메소드에 대한 선언이 코드블럭으로 표시되어 있다. //ex) MakeFunction(); 2. 코드블럭 하단에는 해당 선언에 대한 구현 로직이 작성되어 있다. (ex)
hyrule.tistory.com
#include <crtdbg.h>
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
프로그램이 종료되었을 때 누수 여부를 알려준다.
CGameManager::CGameManager()
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
}
이 코드를 CGameManager에 생성자로 등록하고
동적할당한 변수를 제거하지 않은 채로 프로그램을 종료하면
프로그램이 종료되고 하단 출력 란에 이렇게 메모리 누수가 발생했다는 알림이 뜬다.
_CrtSetBreakAlloc(137);
디버그 모드에서 작동한다.
인자로 전달한 곳의 메모리 블록에 접근 시 중단점을 호출한다.
아까 메모리 누수 발생 알림을 잘 살펴보면 누수가 발생한 메모리 블록 정보가 같이 나온다.
CGameManager::CGameManager()
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
_CrtSetBreakAlloc(137);
}
이 번호를 _CrtSetBreakAlloc() 함수에 인자로 전달하고 디버그 모드로 실행시켜 보자.
그러면, 해당 메모리 블록에서 작업이 일어났을 때 이렇게 중단점이 걸리게 된다.
하지만, 지금 보면 C++ 라이브러리 내부의 동적할당 코드까지 들어왔다.
너무 깊게 들어온 것인데,
이 때는 우측 하단의 '호출 스택'에서 한단계씩 확인해 나가면 어느 부분에서 실행된 코드인지 알 수 있다.
호출 스택을 쭉 확인해나가다 보면 내가 짠 코드 수준으로 올라오게 되고,
어떤 메모리가 제거되지 않았는지 확인할 수 있게 된다.
지금은 이 동적할당이 정상적으로 제거되지 않았다는 이야기이므로 처리해 주면 된다.
_CrtSetDbgFlag() 함수는 항상 동작시키고,
이 함수가 메모리 누수를 탐지하면, 그 때 _CrtSetBreakAlloc() 함수를 집어넣어 메모리 누수를 잡아주면 된다.
앞으로 CGameManager 클래스의 생성자에 항상 등록해 놓자.
CGameManager::CGameManager()
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
//_CrtSetBreakAlloc(100);
}
'WIN32API FrameWork > 한단계씩 직접 구현' 카테고리의 다른 글
06. 화면 출력 (0) | 2022.05.16 |
---|---|
05. PeekMessage 함수와 Run() 루프 (0) | 2022.05.15 |
03. 창이 생성될때의 사이즈 설정하기 (0) | 2022.05.15 |
*** 공부 방법 *** (0) | 2022.05.15 |
02. 프레임워크 기본 설정 및 간단한 구현 (0) | 2022.05.15 |