#include <cstdio>
#include <memory>


struct base
{
    base( int i ): i(i)
    {
        printf("base ctor\n");
    }
    ~base()
    {
        printf("base non-virtual dtor\n");
    } // non-virtual
    int i;
};

struct derived : public base
{
    char* s;
    derived(int i): base(i), s(new char[i] )
    {
        printf("derived ctor\n");
    }
    ~derived()
    {
        printf("derived dtor\n");
        delete [] s;
    }
};

int main()
{
    printf("Success\n");
    
    //raw pointer
    printf("RAW-POINTER\n");
    {
        base* b = new derived(2);
        
        
        delete b;
    }
    printf("---END-RAW-POINTER--\n");
    
    //unique-ptr
    printf("UNIQUE_PTR\n");
    {
        std::unique_ptr<base> bu( new derived(3) );
    }
    printf("--END-UNIQUE_PTR--\n");
    
    
    return 0;
}
