Hi, all: I used an ofdstream.h written by others:
------------->>>>>>>>>>>-------------------<<<<<<<<<<<<------------------------ #ifndef _OFDSTREAM_H #define _OFDSTREAM_H #include <fstream> #include <ostream> #include <ext/stdio_filebuf.h> class ofdstream: public std::ofstream { private: __gnu_cxx::stdio_filebuf< char > m_buf; int m_fd; public: ofdstream( int fd, int bufsize = 4096 ); int fd() const { return( m_fd ); }; }; inline ofdstream::ofdstream( int fd, int bufsize ) #if __GNUC_PREREQ (3,4) : m_buf( fd, std::ios_base::out, bufsize ) #else : m_buf( fd, std::ios_base::out, true, bufsize ) #endif { //this->init(&m_buf); std::basic_ios< char >::rdbuf( & m_buf ); } #endif // _OFDSTREAM_H ------------->>>>>>>>>>>-------------------<<<<<<<<<<<<------------------------ And the below is my test a.cpp: ------------->>>>>>>>>>>-------------------<<<<<<<<<<<<------------------------ #include "fdstream.h" #include <iostream> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> using namespace std; int main() { int fd = open("a.log", O_WRONLY|O_CREAT, 0600); if (fd < 0) { cerr << "open error" << endl; exit(1); } ofdstream ofs(fd); ofs << "testtest" << flush; close(fd); return 0; } ------------->>>>>>>>>>>-------------------<<<<<<<<<<<<------------------------ compile and run it: # g++ -g -o a a.cpp # ./a Segmentation fault (core dumped) # g++ -v Reading specs from /usr/lib/gcc-lib/i686-pc-linux-gnu/3.2/specs Configured with: ../gcc-3.2/configure --prefix=/usr --enable-shared --enable-languages=c,c++ --enable-threads=posix --with-slibdir=/lib --enable-__cxa_atexit --enable-clocale=gnu Thread model: posix gcc version 3.2 The below is backtrace of the core dump: (gdb) bt #0 0x40167d46 in free () from /lib/libc.so.6 #1 0x40157de7 in fclose@@GLIBC_2.1 () from /lib/libc.so.6 #2 0x40053ca4 in std::__basic_file<char>::close () from /usr/lib/libstdc++.so.5 #3 0x4005388f in std::__basic_file<char>::~__basic_file () from /usr/lib/libstdc++.so.5 #4 0x4008b64f in std::basic_filebuf<char, std::char_traits<char>
::~basic_filebuf () from /usr/lib/libstdc++.so.5
#5 0x08049a5a in ~stdio_filebuf (this=0xbffff9fc) at /usr/include/c++/3.2/ext/stdio_filebuf.h:115 #6 0x08049778 in ~ofdstream (this=0xbffff970) at a.cpp:19 #7 0x0804969d in main () at a.cpp:25 But if I compile a.cpp with g++ 3.4.4, there is no segmentation fault. I failed to find and fix the bug. Is this a bug in libstdc++? ------------------- Holderlin Zhang Department of Applied Math., Nankai University