I have the below code, and wrapped the Temple object with a smart pointer. I understood
the concept, but what I did not understand is when the held object's destructor is invoked.
Even thought, i have not implemented ~mySmartPointer, the template destructor is invoked.
OUTPUT
Temple Constructor
Invoking pointer access operator
-- Welcome Temple
Invoking De-referencing Operator
-- Welcome Temple
Temple Destructor
Destructor is Invoked
Code
#include <iostream>
using namespace std;
template <typename T>
class mySmartPointer 
{
private:
    T *_object;    
public: 
    explicit mySmartPointer(T * newObject) {
       _object = newObject;
    };
    ~mySmartPointer() { cout <<"Destructor is Invoked "<<endl;}; 
    T operator *() {
        cout  <<" Invoking De-referencing Operator "<<endl;
        return * _object;
    };
    T * operator ->() {
        cout <<"Invoking pointer access operator "<<endl;
        return _object;
    };
};
class Temple
{
private:
    int x,y;
public:
    void printWelcome() {
        cout <<"-- Welcome Temple "<<endl;
    }
    Temple() {
        cout <<"Temple Constructor"<<endl;
    }
    ~Temple() {
        cout <<"Temple Destructor "<<endl;
    }
};
int main(int argc, char ** argv) {
    mySmartPointer<Temple> t (new Temple);
    t->printWelcome();      
    (*t).printWelcome();
}
 
     
     
     
    