Listing 3: Three techniques for dealing with destructors

// $Id$

#include <gc_cpp.h>
#include <iostream>
using std::cout;
using std::endl;

class ManualDelete : public virtual gc {
public:
  static long constructors;
  static long destructors;
  virtual ~ManualDelete () { ++destructors; };
  ManualDelete () { ++constructors; };
};
long ManualDelete::constructors = 0;
long ManualDelete::destructors = 0;

class AutoDelete : public virtual gc_cleanup {
public:
  static long constructors;
  static long destructors;
  virtual ~AutoDelete () { ++destructors; };
  AutoDelete () { ++constructors; };
};
long AutoDelete::constructors = 0;
long AutoDelete::destructors = 0;

int
main ()
{
  for (long i = 0; i < 500000; ++i) {
    ManualDelete md_on_stack;
    AutoDelete ad_on_stack;

    int *i = new (UseGC) int;
    char *array = new (UseGC) char[4 * 1024];
    ManualDelete *md = new ManualDelete;
    AutoDelete *ad = new AutoDelete;

    // int and char[] don't have destructors, so mustn't delete.
    // Must delete the ManualDelete.
    // Boehm will delete the AutoDelete.
    delete md;
  }
  AutoDelete *ad2 = new AutoDelete;
  delete ad2;
  cout << "ManualDelete constructors "
       << ManualDelete::constructors << ", destructors "
       << ManualDelete::destructors << endl
       << "AutoDelete constructors " << AutoDelete::constructors
       << ", destructors " << AutoDelete::destructors << endl;
  return 0;
}