#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;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8Y3N0ZGludD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CnN0cnVjdCBhcnJheV9kZWxldGVyCnsKICB2b2lkIG9wZXJhdG9yICgpKCBUIGNvbnN0ICogcCkKICB7IAogICAgY291dCA8PCAidXNpbmcgZGVsZXRlW10iIDw8IGVuZGw7CiAgICBkZWxldGVbXSBwOyAKICB9Cn07CgppbnQ4X3QqIGFsbG9jYXRlX2Z1bmMoKQp7CiAgY291dCA8PCAiYWxsb2NhdGluZyBhcnJheSIgPDwgZW5kbDsKICByZXR1cm4gbmV3IGludDhfdFsxMF07Cn0KCmludCBtYWluKCkgewogICAgaW50OF90ICpwdHIgPSBhbGxvY2F0ZV9mdW5jKCk7CiAgICBjb3V0IDw8ICJjcmVhdGluZyBzbWFydCBwb2ludGVyIiA8PCBlbmRsOwoJc2hhcmVkX3B0cjxpbnQ4X3Q+IHNwdHIocHRyLCBhcnJheV9kZWxldGVyPGludDhfdD4oKSk7CiAgICBjb3V0IDw8ICJleGl0aW5nIG1haW4iIDw8IGVuZGw7CiAgICByZXR1cm4gMDsKfQ==