I have my smart pointer implementation as bellow which is NOT deallocating memory at exceptions ..
template <class T>
class SMARTPOINTER
{
public:
   SMARTPOINTER(T* pointee) : SMART_POINTEE(pointee) {
    cout <<"\n Inside class SMARTPOINTER CONSTURCTOR \n";
   }
   ~SMARTPOINTER() {
     cout <<"\n Inside class SMARTPOINTER DESTRUCTOR \n";
      delete SMART_POINTEE;
   }
   T& operator*() const
   {
      cout <<"\n Inside class SMARTPOINTER operator* \n";
      return *SMART_POINTEE;
   }
   T* operator->() const
   {
      cout <<"\n Inside class SMARTPOINTER operator->()  \n";
      return SMART_POINTEE;
   }
private:
   T* SMART_POINTEE;
};
class Widget
{
public:
  Widget() {
      cout <<"\n Inside Widget CONSTRUCTOR \n";
  }
   void Fun() { 
     cout <<"\n Inside Widget::Fun() \n";
   }
  ~Widget() {
      cout <<"\n Inside Widget DESTRUCTOR \n";
  }
};
class THROWME{
};
int main() {
SMARTPOINTER<Widget> sp(new Widget);
sp->Fun();
throw new THROWME;
(*sp).Fun();
return 0 ;
}
I find that the output is
Inside Widget CONSTRUCTOR 
 Inside class SMARTPOINTER CONSTURCTOR 
 Inside class SMARTPOINTER operator->()  
 Inside Widget::Fun() 
uncaught exception of type THROWME*
Aborted.
As far as I know Smart pointers are supposed to help me in such cases!! I do not find destruction of Widget getting called via smart pointer .
So I must be missing some implementation here .
EDIT AFTER COMMENTS READ
With try catch i got my result . But i still dont know if its right approach change in code
  int main() {
        try {
        SMARTPOINTER<Widget> sp(new Widget);
        sp->Fun();
        THROWME tm;
        throw tm;
        (*sp).Fun();
        }
        catch(...) {
          cout <<"\n **SOME EXCEPTION CAUGHT**  \n";
        }
        return 0 ;
        }
result
 Inside Widget CONSTRUCTOR 
 Inside class SMARTPOINTER CONSTURCTOR 
 Inside class SMARTPOINTER operator->()  
 Inside Widget::Fun() 
 Inside class SMARTPOINTER DESTRUCTOR 
 Inside Widget DESTRUCTOR 
 **SOME EXCEPTION CAUGHT**