【问题标题】:ofstream::write() unhandled exceptionofstream::write() 未处理的异常
【发布时间】:2011-12-14 02:46:02
【问题描述】:

所以我正在编写一个日志库来记录各种事情,当我对其进行测试时,它一直在崩溃。当我将日志消息写入 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));

【问题讨论】:

  • 你是从多个线程访问流吗?
  • FWIW,0xfeeefeee 是 MSVC 调试模式下的空闲堆分配内存
  • 开始删除代码,看看问题何时消失。
  • 另外,C++ 异常与访问冲突无关。
  • 不,没有多线程。而且我没有访问冲突的异常处理。

标签: c++ string file-io unhandled-exception ofstream


【解决方案1】:

.c_str() 函数返回一个指针,这可能会导致 ostream 输出出现问题。

除非有理由必须在此块之外将其转换,否则只需传递

【讨论】:

  • ofstream对象不支持std::string类型,所以据我所知需要在string类内部进行转换。
  • @Zayats ofstream 对象确实支持std::strings 的输出。你忘了#include &lt;string&gt;吗?
  • 他们有吗?那是新的。我确实包含了 。无论如何,这并不重要,因为如果我传递 C++ 字符串或 C 字符串,我会得到相同的错误。不过,很高兴知道以供将来参考
猜你喜欢
  • 1970-01-01
  • 2011-11-19
  • 1970-01-01
  • 1970-01-01
  • 2011-01-16
相关资源
最近更新 更多