📄 detectdump.h
字号:
/*************************************************
检测内存溢出支持
只有在_DEBUG模式下有效
*************************************************/
#ifndef CORE_DETECTDUMP_H //DetectDump
#define CORE_DETECTDUMP_H
#ifdef _DEBUG
#ifdef new
#undef new
#endif
namespace SDK_DetectDump
{
class CRunDetectDump //开启检测内存
{
public:
CRunDetectDump()
{
::_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
::_CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_DEBUG );
}
};
class CValidCS //有效临界区
{
private:
CRITICAL_SECTION m_CS_Dump;
public:
CValidCS() { ::InitializeCriticalSection( &m_CS_Dump ); }
~CValidCS() { ::DeleteCriticalSection( &m_CS_Dump ); }
void EnterCS() { ::EnterCriticalSection( &m_CS_Dump ); }
void LeaveCS() { ::LeaveCriticalSection( &m_CS_Dump ); }
};
class CInvalidCS //无效临界区
{
public:
CInvalidCS() { }
~CInvalidCS() { }
void EnterCS() { }
void LeaveCS() { }
};
class CControlCS //控制临界区
{
public:
CControlCS() { GetLock()->EnterCS(); }
~CControlCS() { GetLock()->LeaveCS(); }
//#ifdef _MT //根据编译链接条件判断是否使用临界区
// typedef CValidCS lock_cs;
//#else
typedef CInvalidCS lock_cs;
//#endif
static lock_cs* GetLock()
{
static lock_cs lock;
return &lock;
}
};
}
// 代替普通的 new
inline void* __cdecl operator new( size_t nSize, const char* lpszFileName, int nLine )
{
static SDK_DetectDump::CRunDetectDump _rundetectdump;
SDK_DetectDump::CControlCS _cs;
return ::_malloc_dbg( nSize, _NORMAL_BLOCK, lpszFileName, nLine );
}
// 当 new 表达式调用的构造函数抛出异常时可以正确地释放内存
inline void __cdecl operator delete( void* p, const char* /*lpszFileName*/, int /*nLine*/ )
{
SDK_DetectDump::CControlCS _cs;
::_free_dbg( p, _NORMAL_BLOCK );
}
// 代替普通的 delete
inline void __cdecl operator delete( void* p)
{
SDK_DetectDump::CControlCS _cs;
::_free_dbg( p, _NORMAL_BLOCK );
}
#define new new(__FILE__, __LINE__)
#endif //_DEBUG
#endif //CORE_DETECTDUMP_H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -