Почему я не могу поменять палку? - PullRequest
0 голосов
/ 12 мая 2009

Мне кажется, я не понимаю какой-то тонкости 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 Ответ

4 голосов
/ 12 мая 2009

Я предполагаю, что вы хотите создать переменную стека IerrLog . Вам нужно изменить

IerrLog someLog ();

до

IerrLog someLog;

Ваше исходное утверждение будет интерпретировано компилятором как объявление функции someLog () , которая не принимает аргументов и возвращает IerrLog.

Вы также должны создать свой файл как переменную-член, а не в стеке.

...