jjc@UUNET.UU.NET (James Clark) (04/24/89)
There's a bug in version 1.34.2 g++'s handling of the member version of operator delete. This can lead to operator delete getting called twice for the same object. Script started on Mon Apr 24 11:55:22 1989 jclark% cat bug.c #include <stdio.h> struct A { void *operator new(long); void operator delete(void *); virtual ~A(); }; struct B : A { ~B(); }; struct C : B { ~C(); }; void *A::operator new(long n) { fprintf(stderr, "A::operator new(%d)\n", n); return new char[n]; } void A::operator delete(void *p) { fprintf(stderr, "A::operator delete(%d)\n", p); } A::~A() { fprintf(stderr, "A::~A()\n"); } B::~B() { fprintf(stderr, "B::~B()\n"); } C::~C() { fprintf(stderr, "C::~C()\n"); } main() { A *p = new C; delete p; } jclark% ./g++ -g -v -B./ bug.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__ bug.c /tmp/cca25922.cpp GNU CPP version 1.34 ./c++ /tmp/cca25922.cpp -quiet -dumpbase bug.c -g -version -o /tmp/cca25922.s GNU C++ version 1.34.2 (sparc) compiled by GNU C version 1.34. as /tmp/cca25922.s -o bug.o ./ld++ -C -C ./crt0+.o bug.o -lg++ /usr/local/lib/gcc-gnulib -lg -lc jclark% a.out A::operator new(4) C::~C() B::~B() A::~A() A::operator delete(43056) A::operator delete(43056) jclark% exit jclark% script done on Mon Apr 24 11:55:55 1989 James Clark jjc@jclark.uucp