Приложение C++ аварийно завершает работу при создании экземпляра объекта ofstream.
У меня очень раздражающая проблема при запуске приложения 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 ответ
Почему вы используете динамически размещенный экземпляр 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? Трудно сказать действительно основную информацию, которую вы предоставили...