#include <cstdlib>
#include <iostream>
#include <osg/Geode>
#include <osg/Group>

void MayThrow()
{
   if (rand() % 2)
      throw "Aaaargh!";
}

int main()
{
   try
   {
      srand(time(0));
      osg::ref_ptr<osg::Group> group (new osg::Group());

      // Isso está OK, apesar de um pouco loquaz.
      osg::ref_ptr<osg::Geode> aGeode (new osg::Geode());
      MayThrow();
      group->addChild (aGeode.get());

      // Isso é seguro, também.
      group->addChild (new osg::Geode());

      // Isso é perigoso! Não faça!
      osg::Geode* anotherGeode = new osg::Geode();
      MayThrow();
      group->addChild (anotherGeode);

      // Diga tchau!
      std::cout << "Oh, muito bom. Sem exceções. sem vazamentos.\n";
   }
   catch (...)
   {
      std::cerr << "'anotherGeode' possivelmente vazado!\n";
   }
}
