Prova n° 2

codice:
#include <iostream>
#include <stdlib.h>
#include <memory>

using namespace std;

  class Prova
  {
    public:
      Prova(){cout<<"\nCreato l'oggetto Prova!";};
      ~Prova(){cout<<"\nDistrutto l'oggetto Prova!";};
      void run(){cout<<"\nProva is running!";};
      void pause(){cout<<"\nProva is paused!";};
      void termin(){cout<<"\nProva is terminated!";};
  };

  class Oggetto
  {
    public:
      Oggetto(){cout<<"\nCreato l'oggetto Oggetto!";};
      Oggetto(shared_ptr<Prova> puntatore):mProva(puntatore){cout<<"\nCreato l'oggetto Oggetto!";};
      ~Oggetto(){cout<<"\nDistrutto l'oggetto Oggetto!";};
      void run(){cout<<"\nOggetto is running!";mProva->run();};
      void pause(){cout<<"\nOggetto is paused!";mProva->pause();};
      void termin(){cout<<"\nOggetto is terminated!";mProva->termin();};
    private:
      shared_ptr<Prova> mProva;
  };

int main()
{
  {
    shared_ptr<Prova> prova(new Prova);
    prova->run();
    prova->pause();
    prova->run();
    prova->termin();
    system("pause");
    {
      unique_ptr<Oggetto> oggetto(new Oggetto(prova));
      oggetto->run();
      oggetto->pause();
      oggetto->run();
      oggetto->termin();
    }
    system("pause");
  }
  system("pause");
  return 0;
}
E così vedo che ad ogni fuori scope viene richiamato il distruttore corretto.