Почему я не могу поменять палку?
Я думаю, что я не в состоянии понять некоторые тонкости C++. Я хочу настроить журнал того, что делает моя программа, и обнаружил std::clog
что, кажется, делает то, что я хочу в теории, но на практике это не так.
Если я сделаю следующее, засорение будет работать, как положено, и выведет "Test 1" на экран, а "Test 2" появится в файле:
int main ()
{
clog << "Test 1" << endl;
streambuf* original_buffer = clog.rdbuf (ofstream ("test.log").rdbuf ()));
clog << "test 2" << endl;
clog.rdbuf (original_buffer);
return 0;
}
Но если я помещу все это в класс как таковой, то на экран выводится "Test 1", создается test.log, но внутри ничего нет, а "Test 2" не где найти!:
class IerrLog
{
std::streambuf * original_buffer;
public:
IerrLog ()
{
std::ofstream logFile ("test.log");
original_buffer = std::clog.rdbuf (logFile.rdbuf ());
}
~IerrLog ()
{
std::clog.rdbuf (original_buffer);
}
};
int main () {
clog << "Test 1" << endl;
IerrLog someLog ();
clog << "Test 2" << endl;
return 0;
}
Что мне не хватает?
РЕДАКТИРОВАТЬ: Если я запускаю последний в valgrind, я получаю такие ошибки (первый работает чисто):
Invalid read of size 8
at 0x39598993E5: std::ostream::flush() (in /usr/lib/libstdc++.so.6.0.10)
by 0x395989B5F2: std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&) (in /usr/lib/libstdc++.so.6.0.10)
by 0x400F8E: main (main.cc:23)
Address 0x7ff0006c8 is just below the stack ptr. To suppress, use: --workaround-gcc296-bugs=yes
Я не настолько противен, чтобы думать, что я (довольно распространенный программист) обнаружил ошибку компилятора в такой простой программе, но это еще больше запутало меня, и valgrind, очевидно, обнаружил, что последнее как-то не так, хотя я пытался они функционально идентичны.
1 ответ
Я предполагаю, что вы хотите создать переменную стека IerrLog. Вам нужно изменить
IerrLog someLog ();
в
IerrLog someLog;
Ваше исходное утверждение будет интерпретировано компилятором как объявление функции someLog(), которая не принимает аргументов и возвращает IerrLog.
Вы также должны создать свой файл как переменную-член, а не в стеке.