jjc@UUNET.UU.NET (James Clark) (04/28/89)
g++ can fail to call the appropriate virtual destructor:
Script started on Thu Apr 27 20:13:54 1989
jclark% cat delete.c
#include <stdio.h>
struct A {
virtual ~A() { fputs("~A\n", stderr); }
};
struct B : A {
};
struct C : B {
~C() { fputs("~C\n", stderr); }
};
main()
{
B *p = new C;
delete p;
}
jclark% g++ -g -v delete.c
g++ version 1.34.1
/usr/local/lib/gcc-cpp -+ -v -undef -D__GNU__ -D__GNUG__ -Dsparc -Dsun -Dunix -D__sparc__ -D__sun__ -D__unix__ delete.c /tmp/cca04129.cpp
GNU CPP version 1.34
/usr/local/lib/gcc-c++ /tmp/cca04129.cpp -quiet -dumpbase delete.c -g -version -o /tmp/cca04129.s
GNU C++ version 1.34.1 (sparc) compiled by GNU C version 1.34.
as /tmp/cca04129.s -o delete.o
/usr/local/lib/gcc-ld++ -C -e start -dc -dp -Bstatic /usr/local/lib/crt0+.o delete.o -lg++ /usr/local/lib/gcc-gnulib -lg -lc
jclark% a.out
~A
jclark% exit
jclark%
script done on Thu Apr 27 20:14:35 1989
If p is declared as an A*, ~C() gets called as it should.
James Clark
jjc@jclark.uucp