jjc@UUNET.UU.NET (James Clark) (04/16/89)
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 <stdio.h>
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.uucptiemann@YAHI.STANFORD.EDU (Michael Tiemann) (04/17/89)
This is fixed in what will be 1.35.0. Michael