ofstream :: write () необработанное исключение - PullRequest
0 голосов
/ 14 декабря 2011

Итак, я пишу библиотеку журналов для регистрации всех видов вещей, и когда я запускал на ней тест, она продолжала падать.Я сузил исключение до функции записи, когда записываю сообщение в файл 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, и я даже проверяю, является ли файл действительным и открытым.Когда я устанавливаю точки останова на вызове и вокруг него, вызов работает нормально, но как только он достигает конца функции, он дает мне следующее:

Необработанное исключение в 0x773515ee в LoggerTest.exe: 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));

1 Ответ

0 голосов
/ 14 декабря 2011

Функция .c_str () возвращает указатель, что может вызвать проблемы с выводом ostream.

Если нет необходимости конвертировать его за пределы этого блока, просто передайте << result, не превращая его в строку c, и посмотрите, решит ли это вашу проблему. </p>

...