16,472
社区成员
发帖
与我相关
我的任务
分享
#ifndef _CZUR_COMMON_H
#define _CZUR_COMMON_H
#include "windows.h"
#include <iostream>
class CZURLog
{
public:
CZURLog();
virtual ~CZURLog();
void CreateLogFile(LPCSTR lpszLogName);
void PrintLog(char *pFormat, ...);
public:
FILE *m_pLogFile;
CRITICAL_SECTION m_csLog;
};
class CZURMutex
{
public:
CZURMutex(CRITICAL_SECTION *pcsLog);
virtual ~CZURMutex();
private:
CRITICAL_SECTION *m_pcsLog;
};
//变量声明
extern CZURLog g_OutLog;
void *operator new(size_t size, LPCSTR lpszFileName, int line);
void *operator new[](size_t count, LPCSTR lpszFileName, int line);
#endif //_CZUR_COMMON_H
#include "CZURCommon.h"
CZURLog g_OutLog;
CZURLog::CZURLog()
:m_pLogFile(NULL)
{
InitializeCriticalSection(&m_csLog);
}
CZURLog::~CZURLog()
{
if(m_pLogFile)
{
fclose(m_pLogFile);
}
DeleteCriticalSection(&m_csLog);
}
void CZURLog::CreateLogFile(LPCSTR lpszLogName)
{
if(lpszLogName)
{
m_pLogFile = fopen(lpszLogName, "at+");
}
}
void CZURLog::PrintLog(char *pFormat, ...)
{
char szString[1024];
va_list args;
va_start(args, pFormat);
vsprintf(szString, pFormat, args);
va_end(args);
//获取系统时间
SYSTEMTIME sysTime;
GetLocalTime(&sysTime);
char szLogText[1024];
//格式化本地时间
sprintf_s(
szLogText, 1024, "[%4d-%02d-%02d %02d:%02d:%02d] %s\n",
sysTime.wYear, sysTime.wMonth, sysTime.wDay,
sysTime.wHour, sysTime.wMinute, sysTime.wSecond,
szString
);
CZURMutex mutex(&m_csLog);
if(m_pLogFile)
{
fseek(m_pLogFile, 0, SEEK_END);
fputs(szLogText, m_pLogFile);
fflush(m_pLogFile);
}
}
CZURMutex::CZURMutex(CRITICAL_SECTION *pcsLog)
{
m_pcsLog = pcsLog;
EnterCriticalSection(pcsLog);
}
CZURMutex::~CZURMutex()
{
LeaveCriticalSection(m_pcsLog);
}
void *operator new(size_t size, LPCSTR lpszFileName, int line)
{
void *ptr = NULL;
try
{
ptr = ::operator new(size);
}
catch(std::bad_alloc)
{
g_OutLog.PrintLog("FILE: %s, LINE: %d, Error: Memory Allocation Failed", lpszFileName, line);
}
return ptr;
}
void *operator new[](size_t count, LPCSTR lpszFileName, int line)
{
return operator new(count, lpszFileName, line);
}
/*
关于重载new、new[]的使用说明
在工程中,包含CZURCommon.h、CZURCommon.cpp文件
在需要使用重载的new、new[]运算符的cpp文件中,添加#include "CZURCommon.h",
并宏定义:#define new new(__FILE__, __LINE__)
(宏定义new目的,简化调用时的繁琐,将重载的new、new[]用起来和之前的new、new[]没有任何区别,
如果不进行宏定义,则调用方式:int *p = new(__FILE__, __LINE__) int[2])
程序运行之初,调用g_OutLog.CreateLogFile()函数,创建日志文件
如是,调用new、new[]分配内存失败的时候,捕获异常,在日志中输出相应的错误信息
*/
#include "CZURCommon.h"
#include "stdio.h"
//宏定义new运算符
#define new new(__FILE__, __LINE__)
int main()
{
//设置日志文件名称
g_OutLog.CreateLogFile("d:\\1.log");
//为了测试,循环申请内存,不释放
while(1)
{
char *p = new char;
//内存分配失败,在D盘中的error.log中输出错误信息
if(NULL == p)
{
printf("内存分配失败,请查看日志信息\n");
return 0;
}
}
system("pause");
return 0;
}