[gnu.g++.bug] operator delete

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