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