1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | #pragma once #include <new> #include <string> #include <Windows.h>
#define START_ALLOC { ExceptionCatcher::Get()->StartAlloc(__func__, __LINE__); } #define END_ALLOC { ExceptionCatcher::Get()->EndAlloc(); }
void __cdecl Bad_Alloc_Handler();
class ExceptionCatcher { public: ExceptionCatcher() { std::set_new_handler(Bad_Alloc_Handler);}; ~ExceptionCatcher() {};
static ExceptionCatcher* Get() { static ExceptionCatcher instance; return &instance; }
std::string GetErrorMessage() { return "Fail to Alloc Memory in " + _funcName_stack.top() + " at " + std::to_string(_nLine_stack.top()); } void StartAlloc(const std::string& funcName, const int& nLine) { _funcName_stack.push(funcName); _nLine_stack.push(nLine); } void EndAlloc() { _funcName_stack.pop(); _nLine_stack.pop(); }
static std::stack<std::string> _funcName_stack; static std::stack<int> _nLine_stack; }; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #include "Framework.h" #include "ExceptionHandler.h" #include "Log.h"
std::stack<std::string> ExceptionCatcher::_funcName_stack; std::stack<int> ExceptionCatcher::_nLine_stack;
void __cdecl Bad_Alloc_Handler() { LOG_ERROR(ExceptionCatcher::Get()->GetErrorMessage().c_str()); // MessageBoxA(nullptr, ExceptionCatcher::Get()->GetErrorMessage().c_str(), 0, 0);
throw std::exception(); } |
release 파일에서 동적할당이 실패시 로그따야하므로 만듬
new 있는데마다 START_ALLOC, 끝나고 END_ALLOC 해줘야하는 번거로움이 있으나
생각보다 동적할당하는데가 많지 않아서 try catch 보단 나은거 같은데
동시에 많지 않으니까 오히려 try catch 가 나은거 같기도 하고
현업에선 어떻게 쓰는지 모르겠음.
댓글 없음:
댓글 쓰기