Path: utzoo!telly!attcan!uunet!amdahl!ubvax!lll-winken!csd4.milw.wisc.edu!leah!rpi!tut.cis.ohio-state.edu!UUNET.UU.NET!jclark!jjc From: jclark!jjc@UUNET.UU.NET (James Clark) Newsgroups: gnu.g++.bug Subject: virtual destructor bug Message-ID: <8904161447.AA07845@jclark.uucp> Date: 16 Apr 89 14:47:08 GMT Sender: daemon@tut.cis.ohio-state.edu Distribution: gnu Organization: GNUs Not Usenet Lines: 49 The following script illustrates a bug in the handling of virtual destructors: Script started on Sun Apr 16 15:42:30 1989 jclark% cat test.c #include struct foo { virtual ~foo() { fputs("~foo\n", stderr); } }; struct member { ~member() { fputs("~member\n", stderr); } }; struct bar : foo { member m; }; main() { foo *p = new bar; delete p; putc('\n', stderr); bar *q = new bar; delete q; } jclark% ./g++ -B./ -v test.c g++ version 1.34.2 /usr/local/lib/gcc-cpp -+ -v -undef -D__GNU__ -D__GNUG__ -Dsparc -Dsun -Dunix -D__sparc__ -D__sun__ -D__unix__ test.c /tmp/cca07833.cpp GNU CPP version 1.34 ./c++ /tmp/cca07833.cpp -quiet -dumpbase test.c -version -o /tmp/cca07833.s GNU C++ version 1.34.2 (sparc) compiled by GNU C version 1.34. as /tmp/cca07833.s -o test.o ./ld++ -C -C ./crt0+.o test.o -lg++ /usr/local/lib/gcc-gnulib -lc jclark% a.out ~foo ~member ~foo jclark% exit jclark% script done on Sun Apr 16 15:43:04 1989 I think ~member() should get called for both deletions. Adding an empty definition of ~bar() makes things work correctly. James Clark jjc@jclark.uucp