#include <iostream>
#include <memory>
using namespace std;
class Test {
int n;
public:
Test(int n) : n{n} { cout<<"Constructor"<<n<<endl; }
void show() { cout <<"Do something"<<n<<endl; }
~Test() { cout << "Destructor"<<n<<endl; }
};
class TestDeleterWrong {
public:
void operator()(Test* x) {
x->show();
}
};
class TestDeleterRight {
public:
void operator()(Test* x) {
x->show();
delete x;
}
};
int main() {
{
auto p = make_unique<Test>(1); //ok
}
{
auto p = unique_ptr<Test>(new Test(2)); //ok
}
{
auto p = unique_ptr<Test, TestDeleterWrong>(new Test(3)); // no
}
{
auto p = unique_ptr<Test, TestDeleterRight>(new Test(4)); // ok
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5Pgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgVGVzdCB7CglpbnQgbjsKcHVibGljOgoJVGVzdChpbnQgbikgOiBue259IHsgY291dDw8IkNvbnN0cnVjdG9yIjw8bjw8ZW5kbDsgfQoJdm9pZCBzaG93KCkgeyBjb3V0IDw8IkRvIHNvbWV0aGluZyI8PG48PGVuZGw7IH0KCX5UZXN0KCkgeyBjb3V0IDw8ICJEZXN0cnVjdG9yIjw8bjw8ZW5kbDsgfQp9OwoKY2xhc3MgVGVzdERlbGV0ZXJXcm9uZyB7CnB1YmxpYzoKCXZvaWQgb3BlcmF0b3IoKShUZXN0KiB4KSB7CgkJeC0+c2hvdygpOyAKCX0gCn07CmNsYXNzIFRlc3REZWxldGVyUmlnaHQgewpwdWJsaWM6Cgl2b2lkIG9wZXJhdG9yKCkoVGVzdCogeCkgewoJCXgtPnNob3coKTsgCgkJZGVsZXRlIHg7IAoJfSAKfTsKCmludCBtYWluKCkgewoJewoJCWF1dG8gcCA9IG1ha2VfdW5pcXVlPFRlc3Q+KDEpOyAgICAvL29rCgl9Cgl7CgkJYXV0byBwID0gdW5pcXVlX3B0cjxUZXN0PihuZXcgVGVzdCgyKSk7ICAgIC8vb2sKCX0KCXsKCQlhdXRvIHAgPSB1bmlxdWVfcHRyPFRlc3QsIFRlc3REZWxldGVyV3Jvbmc+KG5ldyBUZXN0KDMpKTsgICAvLyBubyAKCX0KCXsKCQlhdXRvIHAgPSB1bmlxdWVfcHRyPFRlc3QsIFRlc3REZWxldGVyUmlnaHQ+KG5ldyBUZXN0KDQpKTsgICAvLyBvayAKCX0KCXJldHVybiAwOwp9