#include <cstdio>
#include <cstdlib>
#include <utility>
template <typename T>
struct default_delete {
void operator ()(T *ptr) {
delete ptr;
}
};
template <typename T, typename Deleter = default_delete<T>>
class unique_ptr {
public:
unique_ptr(T* resource = nullptr, Deleter deleter = Deleter{})
: resource{resource}, deleter{deleter} {}
unique_ptr(const unique_ptr&) = delete;
unique_ptr(unique_ptr&& other)
: resource{std::move(other.resource)},
deleter{std::move(other.deleter)} {}
unique_ptr& operator=(const unique_ptr&) = delete;
unique_ptr& operator=(unique_ptr&& other) {
using std::swap;
swap(other.resource, resource);
swap(other.deleter, deleter);
}
~unique_ptr() {
deleter(resource);
}
T* get() { return resource; }
const T* get() const { return resource; }
private:
T* resource;
Deleter deleter;
};
int main() {
// using default deleter
unique_ptr<int> int_ptr(new int{});
// using std::free to delete dynamically allocated memory
unique_ptr<int, void(*)(void *)> array_ptr(
reinterpret_cast<int *>(std::malloc(5 * sizeof(int))),
std::free);
// using std::fclose to close an opened file
// You'll have to try this one localy - unable to open file on a server
/*
unique_ptr<FILE, int(*)(FILE *)> file_ptr(
std::fopen("my_file.txt", "w"),
std::fclose);
//*/
// use int_ptr, array_ptr, file_ptr here
// these resources get released here, at the end of scope
}
I2luY2x1ZGUgPGNzdGRpbz4KI2luY2x1ZGUgPGNzdGRsaWI+CiNpbmNsdWRlIDx1dGlsaXR5PgoKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpzdHJ1Y3QgZGVmYXVsdF9kZWxldGUgewogICAgdm9pZCBvcGVyYXRvciAoKShUICpwdHIpIHsKICAgICAgICBkZWxldGUgcHRyOwogICAgfQp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIERlbGV0ZXIgPSBkZWZhdWx0X2RlbGV0ZTxUPj4KY2xhc3MgdW5pcXVlX3B0ciB7CnB1YmxpYzoKICAgIHVuaXF1ZV9wdHIoVCogcmVzb3VyY2UgPSBudWxscHRyLCBEZWxldGVyIGRlbGV0ZXIgPSBEZWxldGVye30pCiAgICAgICAgOiByZXNvdXJjZXtyZXNvdXJjZX0sIGRlbGV0ZXJ7ZGVsZXRlcn0ge30KCiAgICB1bmlxdWVfcHRyKGNvbnN0IHVuaXF1ZV9wdHImKSA9IGRlbGV0ZTsKICAgIHVuaXF1ZV9wdHIodW5pcXVlX3B0ciYmIG90aGVyKSAKICAgICAgICA6IHJlc291cmNle3N0ZDo6bW92ZShvdGhlci5yZXNvdXJjZSl9LAogICAgICAgICAgZGVsZXRlcntzdGQ6Om1vdmUob3RoZXIuZGVsZXRlcil9IHt9CgogICAgdW5pcXVlX3B0ciYgb3BlcmF0b3I9KGNvbnN0IHVuaXF1ZV9wdHImKSA9IGRlbGV0ZTsKICAgIHVuaXF1ZV9wdHImIG9wZXJhdG9yPSh1bmlxdWVfcHRyJiYgb3RoZXIpIHsKICAgICAgICB1c2luZyBzdGQ6OnN3YXA7CiAgICAgICAgc3dhcChvdGhlci5yZXNvdXJjZSwgcmVzb3VyY2UpOwogICAgICAgIHN3YXAob3RoZXIuZGVsZXRlciwgZGVsZXRlcik7CiAgICB9CgogICAgfnVuaXF1ZV9wdHIoKSB7CiAgICAgICAgZGVsZXRlcihyZXNvdXJjZSk7CiAgICB9CgogICAgVCogZ2V0KCkgeyByZXR1cm4gcmVzb3VyY2U7IH0KICAgIGNvbnN0IFQqIGdldCgpIGNvbnN0IHsgcmV0dXJuIHJlc291cmNlOyB9Cgpwcml2YXRlOgogICAgVCogcmVzb3VyY2U7CiAgICBEZWxldGVyIGRlbGV0ZXI7Cn07CgppbnQgbWFpbigpIHsKICAgIC8vIHVzaW5nIGRlZmF1bHQgZGVsZXRlcgogICAgdW5pcXVlX3B0cjxpbnQ+ICBpbnRfcHRyKG5ldyBpbnR7fSk7CgogICAgLy8gdXNpbmcgc3RkOjpmcmVlIHRvIGRlbGV0ZSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgbWVtb3J5CiAgICB1bmlxdWVfcHRyPGludCwgdm9pZCgqKSh2b2lkICopPiBhcnJheV9wdHIoCiAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxpbnQgKj4oc3RkOjptYWxsb2MoNSAqIHNpemVvZihpbnQpKSksCiAgICAgICAgc3RkOjpmcmVlKTsKCiAgICAvLyB1c2luZyBzdGQ6OmZjbG9zZSB0byBjbG9zZSBhbiBvcGVuZWQgZmlsZQogICAgLy8gWW91J2xsIGhhdmUgdG8gdHJ5IHRoaXMgb25lIGxvY2FseSAtIHVuYWJsZSB0byBvcGVuIGZpbGUgb24gYSBzZXJ2ZXIKICAgIC8qCiAgICB1bmlxdWVfcHRyPEZJTEUsIGludCgqKShGSUxFICopPiBmaWxlX3B0cigKICAgICAgICBzdGQ6OmZvcGVuKCJteV9maWxlLnR4dCIsICJ3IiksCiAgICAgICAgc3RkOjpmY2xvc2UpOwogICAgLy8qLwogICAgLy8gdXNlIGludF9wdHIsIGFycmF5X3B0ciwgZmlsZV9wdHIgaGVyZQoKICAgIC8vIHRoZXNlIHJlc291cmNlcyBnZXQgcmVsZWFzZWQgaGVyZSwgYXQgdGhlIGVuZCBvZiBzY29wZQp9Cg==