#include <iostream>
#include <memory>
#include <cstdint>

using namespace std;

template< typename T >
struct array_deleter
{
  void operator ()( T const * p)
  { 
    cout << "using delete[]" << endl;
    delete[] p; 
  }
};

int8_t* allocate_func()
{
  cout << "allocating array" << endl;
  return new int8_t[10];
}

int main() {
    int8_t *ptr = allocate_func();
    cout << "creating smart pointer" << endl;
	shared_ptr<int8_t> sptr(ptr, array_deleter<int8_t>());
    cout << "exiting main" << endl;
    return 0;
}