Приложение C ++ падает при создании экземпляра объекта ofstream. - PullRequest
1 голос
/ 18 ноября 2010

У меня очень раздражающая проблема при запуске приложения C ++.Я использую компилятор pgcpp в подсистеме Interix Windows Xp.Моя проблема в основном описана здесь:

У меня есть определение класса в заголовочном файле.Этот заголовочный файл включен в один исходный файл.Этот класс имеет два конструктора и в основном используется для реализации регистратора.Первый конструктор принимает ostream * в качестве аргумента, а второй перегруженный конструктор принимает имя файла и логическое значение по умолчанию false.Цель этого второго конструктора - получить поток для имени файла, который мы передаем, и начать записывать в него сообщения.Код в конструкторах выглядит следующим образом:

MessageLogger::MessageLogger(std::ostream *out): p_out (out), p_ofstream (0)  
{  
    if (p_out)  
    {  
        (*p_out) << "Started logging messages" << endl;  
    }  
}  

MessageLogger::MessageLogger (char const *filename, bool append_to_file) : p_out (0),   p_ofstream (0)  
{  
    if (append_to_file)  
    {  
    p_ofstream = new std::ofstream (filename, ios::app);  
    }  
    else  
    {  
        p_ofstream = new std::ofstream (filename);  
    }  

    p_out = p_ofstream;  

    if (p_out)  
    {  
        (*p_out) << "Started logging messages" << endl;  
    }  
}  

Где объявления p_out и p_ofstream следующие:

std::ostream *p_out;
std::ofstream *p_ofstream;
unsigned int p_indent_level;

Все три упомянутых выше являются частными членами.Создание экземпляра класса MessageLogger выполняется следующим образом:

MessageLogger logger ("filename");

Обратите внимание, что append_to_file имеет значение по умолчанию false.PGDBG также плохо себя ведет.Я необъяснимым образом могу вмешаться, когда элемент управления находится на p_ofstream = new std::ofstream (filename);, и он входит в случайное место, а затем происходит сбой приложения.

Кроме того, когда я пытаюсь увидеть смешанный код или код дизассемблирования в PGDBG, отладчик выдает сообщение:

jpgdbg parse: Newline must follow cmd in 'eleq "0" struct MessageLogger *Mes
sageLogger::MessageLogger(struct basic_ostream *out); (TranslatorGeneric.cpp
)
'
jpgdbg jpgdbgFileSelector processMsg: Warning unexpected msg token 5
jpgdbg parse: Newline must follow cmd in 'eleq "1" struct MessageLogger *Mes
sageLogger::MessageLogger(char *filename, unsigned char append_to_file); (Tr
anslatorGeneric.cpp)
'
jpgdbg jpgdbgFileSelector processMsg: Warning unexpected msg token 5

Я не могу воспроизвести это в примере программы, в которой ясделал то же самое, что и выше, но все работает отлично.Может кто-нибудь объяснить, пожалуйста, что происходит, и если есть решение этой проблемы?

Спасибо, Адитья.

1 Ответ

0 голосов
/ 18 ноября 2010

Почему вы используете динамически распределяемый экземпляр ofstream? Почему бы тебе не сделать что-то вроде следующего ...

class Logger
{
  public:
    Logger(ostream& str) : _str(str.rdbuf()) // use the buffer from the stream
    {
      _str << "writing to passed in buffer" << endl;
    }
    Logger(const char* fname, bool append = false) : _str(cout.rdbuf())
    {
      _file.open(fname, (append)? ios::out|ios::app : ios::out);
      if (_file.is_open())
        _str.rdbuf(&_file); // redirects to file, else remains on cout

      _str << "expected to be logging to: " << fname << endl;
    }

    // use as needed

  private:
    filebuf _file;
    ostream _str;
};

Таким образом, даже если ваш файл потерпит неудачу, вы все равно получите вывод журнала, идущий в cout ...

Возвращаясь к вашей проблеме, что делает HW_NEW? Трудно сказать действительно основную информацию, которую вы предоставили ...

...