Listing 3

SomeObject* SomeFunction1();

void CodeSnippet1() {
  // something fishy going on, but nothing identifiable by compiler
  SomeObject* p;
  p = SomeFunction1();
  delete p;
}

undeletable_ptr<SomeObject> SomeFunction2();

void CodeSnippet2() {
  SomeObject* p;
  p = SomeFunction2(); // compilation error
  delete p;
}

undeletable_ptr<SomeObject> SomeFunction3();

void CodeSnippet3() {
  undeletable_ptr<SomeObject> p;
  p = SomeFunction3();
  delete p; // compilation error
}