所以我正在编写一个用于记录各种事物的日志库,当我对它进行测试时,它一直在崩溃。当我将日志消息写入ofstream文件时,我将异常缩小到写入函数。我解析了消息和东西,然后我实际调用了ofstream :: write()。这是我得到重新发送错误的部分:
void Logger::writeMessage(LogMessage* message)
{
if(message==NULL)
return;
char buffer[MAX_PATH];
switch(message->GetMessageType())
{
case LOGMESSAGE_HEADER:
sprintf(buffer, m_logInfo->headerFormat, message->GetMessage().c_str());
break;
case LOGMESSAGE_FOOTER:
sprintf(buffer, m_logInfo->footerFormat, message->GetMessage().c_str());
break;
case LOGMESSAGE_DEBUG:
sprintf(buffer, "%s %s", m_logInfo->debugPrefix.c_str(), message->GetMessage().c_str());
break;
case LOGMESSAGE_ADDRESS:
sprintf(buffer, "%s %s", m_logInfo->addressPrefix.c_str(), message->GetMessage().c_str());
break;
case LOGMESSAGE_VALUE:
sprintf(buffer, "%s %s", m_logInfo->valuePrefix.c_str(), message->GetMessage().c_str());
break;
case LOGMESSAGE_CUSTOM:
default:
sprintf(buffer, "test!", message->GetMessage().c_str());
break;
}
try
{
if(!m_ofile.is_open() || !m_ofile.good())
return;
//string formattedMessage(buffer);
//formattedMessage.append(m_logInfo->lineTerminator);
string result;
if(message->IsUsingTimestamp())
{
m_ofile << message->GetTimeStamp().GetTimeString().c_str() << " ";
//result.append(message->GetTimeStamp().GetTimeString());
//result.append(" ");
}
m_ofile << buffer << m_logInfo->lineTerminator;
//result.append(formattedMessage);
//result.push_back('\0');
//m_ofile.write(result.c_str(), MAX_PATH);
//m_ofile << result.c_str();
}
catch(std::exception &e)
{
MessageBox(NULL, e.what(), "ERROR", NULL);
}
}
正如您所看到的,我在try catch块中进行调用,甚至检查文件是否有效并打开。当我在通话中及其周围设置断点时,通话工作正常,但一旦到达功能的结尾,它就会给我这个:
LoggerTest.exe中0x773515ee处的未处理异常:0xC0000005:访问冲突写入位置0xfeeefeee。
然后它显示xlock.cpp中此函数中发生的错误:
__thiscall _Lockit::_Lockit(int kind)
: _Locktype(kind)
{ // lock the mutex
if (_Locktype < MAX_LOCK)
_Mtxlock(&mtx[_Locktype]);
}
我的猜测是我在某个地方有一个坏的字符串或指针,但我无法确定它。
注意:我试过
m_ofile << "test!";
现在它让我在这里断言失败:_ASSERTE(_CrtIsValidHeapPointer(pUserData));
答案 0 :(得分:0)
.c_str()函数返回一个指针,这可能会导致ostream输出出现问题。
除非有必要将其转换到此块之外的原因,否则只需传递&lt;&lt;结果没有把它变成一个c字符串,看看是否能解决你的问题。