#include <memory>
#include <cstdio>
struct MyClass {
int i;
MyClass(int i_) noexcept : i(i_) {}
~MyClass() { std::printf("Destroyed %d!\n", i); }
};
int main() {
using std::shared_ptr;
using std::static_pointer_cast;
void* rawPtr = new MyClass(1);
shared_ptr<void> exampleVoid(rawPtr); // Undefined behavior;
// calls delete (void*)ptr;
shared_ptr<void> exampleVoidCons(new MyClass(2));
// OK, calls shared_ptr<void>::shared_ptr<MyClass>(MyClass*) which
// makes a deleter calling delete (MyClass*)ptr;
shared_ptr<MyClass> example(new MyClass(3)); // OK, calls delete (MyClass*)ptr;
shared_ptr<void> castToVoid = static_pointer_cast<void>(example);
// OK, shared_ptr's deleter is erased so this still calls delete (MyClass*)ptr;
}
I2luY2x1ZGUgPG1lbW9yeT4KI2luY2x1ZGUgPGNzdGRpbz4KCnN0cnVjdCBNeUNsYXNzIHsKCWludCBpOwoJTXlDbGFzcyhpbnQgaV8pIG5vZXhjZXB0IDogaShpXykge30KCX5NeUNsYXNzKCkgeyBzdGQ6OnByaW50ZigiRGVzdHJveWVkICVkIVxuIiwgaSk7IH0KCX07CgppbnQgbWFpbigpIHsKCXVzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKCXVzaW5nIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDsKCQoJdm9pZCogcmF3UHRyID0gbmV3IE15Q2xhc3MoMSk7CglzaGFyZWRfcHRyPHZvaWQ+IGV4YW1wbGVWb2lkKHJhd1B0cik7IC8vIFVuZGVmaW5lZCBiZWhhdmlvcjsKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FsbHMgZGVsZXRlICh2b2lkKilwdHI7CgkKCXNoYXJlZF9wdHI8dm9pZD4gZXhhbXBsZVZvaWRDb25zKG5ldyBNeUNsYXNzKDIpKTsKCSAgICAvLyBPSywgY2FsbHMgc2hhcmVkX3B0cjx2b2lkPjo6c2hhcmVkX3B0cjxNeUNsYXNzPihNeUNsYXNzKikgd2hpY2gKCSAgICAvLyBtYWtlcyBhIGRlbGV0ZXIgY2FsbGluZyBkZWxldGUgKE15Q2xhc3MqKXB0cjsKCQoJc2hhcmVkX3B0cjxNeUNsYXNzPiBleGFtcGxlKG5ldyBNeUNsYXNzKDMpKTsgLy8gT0ssIGNhbGxzIGRlbGV0ZSAoTXlDbGFzcyopcHRyOwoJCglzaGFyZWRfcHRyPHZvaWQ+IGNhc3RUb1ZvaWQgPSBzdGF0aWNfcG9pbnRlcl9jYXN0PHZvaWQ+KGV4YW1wbGUpOwoJICAgIC8vIE9LLCBzaGFyZWRfcHRyJ3MgZGVsZXRlciBpcyBlcmFzZWQgc28gdGhpcyBzdGlsbCBjYWxscyBkZWxldGUgKE15Q2xhc3MqKXB0cjsKfQ==