#include <iostream>
#include <memory>
template <typename T>
class SKOptionalPtr : public std::shared_ptr<T>
{
public:
// inherited constructors.
using std::shared_ptr<T>::shared_ptr;
void weak(T* object)
{
this->reset(object, [] (T*) {});
}
};
int main() {
SKOptionalPtr<int> ptr;
// pointeur à détruire
ptr.reset(new int(1));
// pointer à ne pas détruire
int already_allocated = 1234;
ptr.weak(&already_allocated);
std::cout << *ptr << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CmNsYXNzIFNLT3B0aW9uYWxQdHIgOiBwdWJsaWMgc3RkOjpzaGFyZWRfcHRyPFQ+CnsKcHVibGljOgogICAgLy8gaW5oZXJpdGVkIGNvbnN0cnVjdG9ycy4KICAgIHVzaW5nIHN0ZDo6c2hhcmVkX3B0cjxUPjo6c2hhcmVkX3B0cjsKCiAgICB2b2lkIHdlYWsoVCogb2JqZWN0KQogICAgewogICAgCXRoaXMtPnJlc2V0KG9iamVjdCwgW10gKFQqKSB7fSk7CiAgICB9Cn07CgppbnQgbWFpbigpIHsKCVNLT3B0aW9uYWxQdHI8aW50PiBwdHI7CgogICAgLy8gcG9pbnRldXIgw6AgZMOpdHJ1aXJlCiAgICBwdHIucmVzZXQobmV3IGludCgxKSk7CgogICAgLy8gcG9pbnRlciDDoCBuZSBwYXMgZMOpdHJ1aXJlCiAgICBpbnQgYWxyZWFkeV9hbGxvY2F0ZWQgPSAxMjM0OwogICAgcHRyLndlYWsoJmFscmVhZHlfYWxsb2NhdGVkKTsKCiAgICBzdGQ6OmNvdXQgPDwgKnB0ciA8PCBzdGQ6OmVuZGw7CgoJcmV0dXJuIDA7Cn0=