c++ 流在多线程下出现不可捕获的错误异常,在 windows 和 linux 中都出现

c++ 流在多线程下出现不可捕获的异常错误,在 windows 和 linux 中都出现,
c++ 流在多线程下出现不可捕获的异常错误,在 windows 和 linux 中都出现,
就是在 需要转存日志的这一行 m_output->close(); 确实怪异,导致程序退出

//头文件 simplelog.h 内容
#ifndef _CSIMPLELOG_INCLUDE_
#define _CSIMPLELOG_INCLUDE_

#include <string>
#include <iostream>

class MyOSMutex;

class CSimpleLog
{
private:
//日志文件路径
std::string m_logname;
//写文件锁
MyOSMutex *m_mutex;
//日志文件指针
std::ofstream *m_output;
//写缓冲
const unsigned int BUFFSIZE;
char *m_buff;
//char m_buff[BUFFSIZE];
  //文件尺寸 20M
int m_maxfilesize;
//sington唯一实例
static CSimpleLog * m_instance;
//转存文件
void inline Save();
//得到新文件名
void inline GetNewFileName(char *filename);
protected:
CSimpleLog();
public:
//初始化
void Initiate(const std::string &logname,int maxfilesize = 20);
//写日志内容
void Addlog(const char* fmt, ...);
//按 16 进制输出数据包
void AddHexlog(const unsigned char *buff,int len);  
//得到唯一实例
static CSimpleLog& Instance();

~CSimpleLog(void);
};
#endif

//实现 simplelog.cpp 内容
#include "simplelog.h"
#include "myosmutex.h"
#include <stdio.h>
#include <fstream>
#include <iostream>
#include <string>
using namespace std;
#include <stdarg.h>

CSimpleLog * CSimpleLog::m_instance = 0;

CSimpleLog::CSimpleLog():m_mutex(0),
m_output(0),m_buff(0),BUFFSIZE(1024),
m_maxfilesize(1024 * 1024 * 20)
{
if(m_mutex == 0)
{
m_mutex = new MyOSMutex();
}

if(m_buff == 0)
{
m_buff = new char[1024];
}
}

CSimpleLog::~CSimpleLog(void)
{
if(m_output)
{
m_output->flush();
m_output->close();
delete m_output;
m_output = 0;
}

if(m_buff)
{
delete []m_buff;
m_buff = 0;
}

if(m_mutex)
{
delete m_mutex;
m_mutex = 0;
}

delete this;
}

void CSimpleLog::Initiate(const std::string &logname,int maxfilesize)
{
m_maxfilesize = maxfilesize * 1024 * 1024;
m_logname = logname;
size_t length = logname.length();
if(length >= 255 || length < 4)
{
return;
}

char filename[255];
GetNewFileName(filename);
if(m_output == 0)
{
m_output = new std::ofstream(filename,ios::out|ios::ate|ios::app);
}
}

//得到唯一实例
CSimpleLog& CSimpleLog::Instance()
{
for(;;)
{
if(m_instance == 0)
{
m_instance = new CSimpleLog();
}
if(m_instance)
{
break;
}
}
return *m_instance;
}

void CSimpleLog::Addlog(const char* fmt, ...)
{
static unsigned short lines = 0;
m_mutex->Lock();
va_list argptr; 
//分析字符串的格式
va_start(argptr,fmt);
#ifdef WIN32
_vsnprintf(m_buff,BUFFSIZE,fmt,argptr);
#else
vsnprintf(m_buff,BUFFSIZE,fmt,argptr);
#endif
va_end(argptr);

//以添加的方式输出到文件
if(m_output)
{
//CDateTime dt;
//(*m_output)<<dt.LongDateTime()<<" "<<m_buff<<endl;
(*m_output)<<m_buff<<endl;

if(m_output->bad())
{
m_output->clear();
}

lines++;
if(lines > 1000)
{
lines = 0;
//m_output->flush();
Save();
}
}
m_mutex->Unlock();
}

void inline CSimpleLog::GetNewFileName(char *filename)
{
//最多存储 50 个日志文件
const int MAXIUMCOUNT = 50;
for(int i = 0;i < MAXIUMCOUNT;++i)
{
//char filename[255];
//文件索引
static unsigned int short fileindex = 0;
memset(filename,0,sizeof(filename));