2015-11-30 3 views
1

У меня есть эта функция, чтобы написать какую-то информацию журнала в файлнеобработанного исключения иногда при вызове fcout

int Comm::saveInfo(LPTSTR msg) 
{ 
#ifdef _log 
    wofstream fcout(LogFile, ios::out | ios::app); 
    if (fcout.is_open()) 
    { 

     fcout << msg << "\t" << (int) ::GetTickCount64() << endl; 
     fcout.close(); 
    } 
#endif 
    return 0; // this is where visual studio 2012 is pointing to for the crash 
} 

Эта функция работает иногда, но иногда приводит к вылетам ... :(

Вот как я называю это функция:.

saveInfo(TEXT("set measurement time...")); 
ret = readMsg(Buf, WAITTIMOUT); 

в файле заголовок Comm класса Заявляет std::wstring LogFile; как частный член readMsg является функцией читать пип е

int CpipeComm::readMsg(LPTSTR chBuf, DWORD timeout) 
{ 

    OVERLAPPED overlapped; 
    memset(&overlapped, 0, sizeof(overlapped)); 
    memset(&chBuf[0], 0, sizeof(chBuf)); 

    int err = 0; 
    ULONGLONG time1 = ::GetTickCount64(); 
    DWORD bytesRead = 0; 
    do 
    { 
    // Read from the pipe. 
     fSuccess = ReadFile( 
     hPipe, // pipe handle 
     chBuf, // buffer to receive reply 
     BUFSIZE*sizeof(TCHAR), // size of buffer 
     &cbRead, // number of bytes read 
     &overlapped); // not overlapped 

return 0; 
} 

И в конструктор класса Comm я

LogFile.assign(L"Pipe_log.log"); 

случайная ошибка, что я получаю это;

Unhandled exception at 0x000007FEF782AFD3 (msvcp110.dll) in : 0xC0000005: Access violation reading location 0x0000000000000012. 

Я не уверен, что есть что-то, что я делаю неправильно! Каким-то образом эти две функции одно за другим вызывают крушение! Если я переместил функцию saveInfo в другое место, все будет хорошо работать ...

+0

Похоже, что вы могли бы быть разыменования нулевого указателя. К сожалению, здесь недостаточно, чтобы действительно диагностировать проблему. – Cornstalks

+0

Похоже, вы получаете доступ к памяти вне пределов ... Запустите программу в отладчике до тех пор, пока не произойдет ошибка; отладчик должен поймать его и сообщить, где это произошло. –

ответ

1

В качестве имени файла нет допустимого конструктора потока файлов, который принимает std::wstring. Похоже, это тип LogFile, основанный на вашем примере для его инициализации.

Вы должны вместо того, чтобы построить поток, как это:

wofstream fcout(LogFile.c_str(), ios::out | ios::app); 
Смежные вопросы