#include <iostream>
#include <memory>
struct BadDeleter
{
BadDeleter() noexcept(false) { std::cout << "BadDeleter()" << std::endl; }
~BadDeleter() noexcept(false) { std::cout << "~BadDeleter()" << std::endl; }
BadDeleter(const BadDeleter&) noexcept(false) { std::cout << "BadDeleter(const BadDeleter&)" << std::endl; }
BadDeleter(BadDeleter&) noexcept(false) { std::cout << "BadDeleter(BadDeleter&)" << std::endl; }
BadDeleter(BadDeleter&&) noexcept(false) { std::cout << "BadDeleter(BadDeleter&&)" << std::endl; }
void operator()(char* p) const noexcept(false) {
std::cout << "operator()" << std::endl;
delete p;
};
};
int main()
{
BadDeleter d;
std::cout << "Example constructor(3)...\n";
{ // deleter type is not a reference
std::unique_ptr<char, BadDeleter> up3(new char, d); // deleter copied
}
{ // deleter type is a reference
std::unique_ptr<char, BadDeleter&> up3b(new char, d); // up3b holds a reference to d
}
std::cout << "Example constructor(4)...\n";
{ // deleter is not a reference
std::unique_ptr<char, BadDeleter> up4(new char, BadDeleter()); // deleter moved
}
std::cout << "Example constructor(6)...\n";
{
std::unique_ptr<char, BadDeleter> up6a(new char, d); // BadDeleter is copied
std::unique_ptr<char, BadDeleter> up6b(std::move(up6a)); // BadDeleter is moved
std::unique_ptr<char, BadDeleter&> up6c(new char, d); // BadDeleter is a reference
std::unique_ptr<char, BadDeleter> up6d(std::move(up6c)); // BadDeleter is copied
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgoKc3RydWN0IEJhZERlbGV0ZXIKewogICAgQmFkRGVsZXRlcigpIG5vZXhjZXB0KGZhbHNlKSB7IHN0ZDo6Y291dCA8PCAiQmFkRGVsZXRlcigpIiA8PCBzdGQ6OmVuZGw7IH0KICAgIH5CYWREZWxldGVyKCkgbm9leGNlcHQoZmFsc2UpIHsgc3RkOjpjb3V0IDw8ICJ+QmFkRGVsZXRlcigpIiA8PCBzdGQ6OmVuZGw7IH0KICAgIEJhZERlbGV0ZXIoY29uc3QgQmFkRGVsZXRlciYpIG5vZXhjZXB0KGZhbHNlKSB7IHN0ZDo6Y291dCA8PCAiQmFkRGVsZXRlcihjb25zdCBCYWREZWxldGVyJikiIDw8IHN0ZDo6ZW5kbDsgfQogICAgQmFkRGVsZXRlcihCYWREZWxldGVyJikgbm9leGNlcHQoZmFsc2UpIHsgc3RkOjpjb3V0IDw8ICJCYWREZWxldGVyKEJhZERlbGV0ZXImKSIgPDwgc3RkOjplbmRsOyB9CiAgICBCYWREZWxldGVyKEJhZERlbGV0ZXImJikgbm9leGNlcHQoZmFsc2UpIHsgc3RkOjpjb3V0IDw8ICJCYWREZWxldGVyKEJhZERlbGV0ZXImJikiIDw8IHN0ZDo6ZW5kbDsgfQogICAgdm9pZCBvcGVyYXRvcigpKGNoYXIqIHApIGNvbnN0IG5vZXhjZXB0KGZhbHNlKSB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJvcGVyYXRvcigpIiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgZGVsZXRlIHA7CiAgICB9Owp9OwoKaW50IG1haW4oKQp7CiAgICBCYWREZWxldGVyIGQ7CiAgICAKICAgIHN0ZDo6Y291dCA8PCAiRXhhbXBsZSBjb25zdHJ1Y3RvcigzKS4uLlxuIjsKICAgIHsgIC8vIGRlbGV0ZXIgdHlwZSBpcyBub3QgYSByZWZlcmVuY2UKICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxjaGFyLCBCYWREZWxldGVyPiB1cDMobmV3IGNoYXIsIGQpOyAvLyBkZWxldGVyIGNvcGllZAogICAgfQogICAgeyAgLy8gZGVsZXRlciB0eXBlIGlzIGEgcmVmZXJlbmNlIAogICAgICAgc3RkOjp1bmlxdWVfcHRyPGNoYXIsIEJhZERlbGV0ZXImPiB1cDNiKG5ldyBjaGFyLCBkKTsgLy8gdXAzYiBob2xkcyBhIHJlZmVyZW5jZSB0byBkCiAgICB9CiAKICAgIHN0ZDo6Y291dCA8PCAiRXhhbXBsZSBjb25zdHJ1Y3Rvcig0KS4uLlxuIjsKICAgIHsgIC8vIGRlbGV0ZXIgaXMgbm90IGEgcmVmZXJlbmNlIAogICAgICAgc3RkOjp1bmlxdWVfcHRyPGNoYXIsIEJhZERlbGV0ZXI+IHVwNChuZXcgY2hhciwgQmFkRGVsZXRlcigpKTsgLy8gZGVsZXRlciBtb3ZlZAogICAgfQogCiAgICBzdGQ6OmNvdXQgPDwgIkV4YW1wbGUgY29uc3RydWN0b3IoNikuLi5cbiI7CiAgICB7CiAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGNoYXIsIEJhZERlbGV0ZXI+IHVwNmEobmV3IGNoYXIsIGQpOyAvLyBCYWREZWxldGVyIGlzIGNvcGllZAogICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxjaGFyLCBCYWREZWxldGVyPiB1cDZiKHN0ZDo6bW92ZSh1cDZhKSk7IC8vIEJhZERlbGV0ZXIgaXMgbW92ZWQKIAogICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxjaGFyLCBCYWREZWxldGVyJj4gdXA2YyhuZXcgY2hhciwgZCk7IC8vIEJhZERlbGV0ZXIgaXMgYSByZWZlcmVuY2UKICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Y2hhciwgQmFkRGVsZXRlcj4gdXA2ZChzdGQ6Om1vdmUodXA2YykpOyAvLyBCYWREZWxldGVyIGlzIGNvcGllZAogICAgfQoKICAgIHJldHVybiAwOwp9Cgo=