2009-05-12 5 views
0

저는 C++의 좀 더 미세한 점을 이해하지 못하고 있다고 생각합니다. 내 프로그램이하는 일에 대한 로그를 만들고 싶고, 내가 이론에서 원하는 것을 수행하는 것으로 보이는 std::clog을 발견했지만 실제로는 그렇지 않습니다. 다음과 같은 처리를 할 경우왜 내 방해물이 달라 붙지 않습니까?

, 막힘 작품은 예상대로 화면에 "테스트 1"을 기록하고 "테스트 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; 
} 

하지만 난에 모든 것을 넣어 경우 그러한 후 "테스트 1"화면에 기록 된대로 클래스는 test.log가 생성되지만 내부에 아무것도 "테스트 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는 분명히 후자가 어떻게 든 잘못된다는 것을 발견한다.

답변

4

IerrLog의 스택 변수를 생성한다고 가정합니다. 당신은 인수가없는 및 ​​IerrLog을 반환 기능 someLog()의 선언으로 컴파일러에 의해 해석됩니다

IerrLog someLog; 

원래 문에

IerrLog someLog(); 

을 변경해야합니다.

또한 파일을 스택이 아닌 멤버 변수로 만들어야합니다.

+0

와우는 빨랐습니다. 'logFile'이 스택에 있다는 것이 실제로 문제가되었습니다! – MighMoS

+0

아니요 - 거기에있는 첫 번째 줄은 인수가없고 IerrLog를 반환하는 someLog() 함수의 선언으로 해석됩니다. –

+0

@Drew 당신 말이 맞아요, 나는 대답을 수정합니다. – lothar