// file : examples/mm/shptr/shptr.cxx // author : Boris Kolpackov // copyright : Copyright (c) 2005-2010 Boris Kolpackov // license : GNU GPL v2 + exceptions; see accompanying LICENSE file #include #include // MM::locate #include // MM::inc_ref #include using std::cerr; using std::endl; using namespace Cult; using namespace MM; struct Foo { virtual ~Foo () {} char c; }; struct Bar: virtual Foo {char c;}; struct Baz: virtual Foo {char c;}; struct Fox: Bar, Baz {}; struct A { char c[8]; }; struct B { char c[8]; }; struct C : A, B { char c[8]; }; int main () { { Baz* bp (new Fox); Foo* fp (bp); Counter* cp (locate (fp, *counted)); inc_ref (bp); cp->dec_ref (); if (cp->dec_ref ()) cerr << "good: destroying" << endl; else cerr << "bad: leaking" << endl; delete bp; } { Shptr pfox (new Fox); Shptr pbar (pfox); Shptr pfoo; pfoo = pbar; } }