#include <iostream>
#include <memory>
#include <string>
class Widget {
public:
Widget(): pImpl(std::make_shared<Impl>()),
pc(new CAT){}
~Widget() {
delete pc; // I know we should put this code to cpp
// I am just want to show the difference behavior
// between raw pointer and smart pointer
// when widget object destruct
}
private:
struct Impl {
std::string name;
Impl(){std::cout<<"Impl"<<std::endl;}
~Impl(){std::cout<<"~Impl"<<std::endl;}
};
std::shared_ptr<Impl> pImpl; // use smart pointer
struct CAT
{
std::string name;
CAT(){std::cout<<"CAT"<<std::endl;}
~CAT(){std::cout<<"~CAT"<<std::endl;}
};
CAT *pc; //raw pointer
};
int main() {
Widget w;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8c3RyaW5nPgoKY2xhc3MgV2lkZ2V0IHsgCiAgICBwdWJsaWM6CiAgICAgICAgV2lkZ2V0KCk6IHBJbXBsKHN0ZDo6bWFrZV9zaGFyZWQ8SW1wbD4oKSksCiAgICAgICAgICAgICAgICAgIHBjKG5ldyBDQVQpe30KICAgICAgICB+V2lkZ2V0KCkgewogICAgICAgICAgICBkZWxldGUgcGM7IC8vIEkga25vdyB3ZSBzaG91bGQgcHV0IHRoaXMgY29kZSB0byBjcHAKICAgICAgICAgICAgICAgICAgICAgICAvLyBJIGFtIGp1c3Qgd2FudCB0byBzaG93IHRoZSBkaWZmZXJlbmNlIGJlaGF2aW9yCiAgICAgICAgICAgICAgICAgICAgICAgLy8gYmV0d2VlbiByYXcgcG9pbnRlciBhbmQgc21hcnQgcG9pbnRlcgogICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gd2lkZ2V0IG9iamVjdCBkZXN0cnVjdAogICAgICAgIH0KICAgIHByaXZhdGU6CiAgICAgICAgc3RydWN0IEltcGwgewogICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lOwogICAgICAgICAgICBJbXBsKCl7c3RkOjpjb3V0PDwiSW1wbCI8PHN0ZDo6ZW5kbDt9CiAgICAgICAgICAgIH5JbXBsKCl7c3RkOjpjb3V0PDwifkltcGwiPDxzdGQ6OmVuZGw7fQogICAgICAgIH07CiAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IHBJbXBsOyAgLy8gdXNlIHNtYXJ0IHBvaW50ZXIKICAgICAgICBzdHJ1Y3QgQ0FUIAogICAgICAgIHsKICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKICAgICAgICAgICAgQ0FUKCl7c3RkOjpjb3V0PDwiQ0FUIjw8c3RkOjplbmRsO30KICAgICAgICAgICAgfkNBVCgpe3N0ZDo6Y291dDw8In5DQVQiPDxzdGQ6OmVuZGw7fQogICAgICAgIH07ICAKICAgICAgICBDQVQgKnBjOyAgLy9yYXcgcG9pbnRlcgp9OwoKCmludCBtYWluKCkgewogICAgV2lkZ2V0IHc7CiAgICByZXR1cm4gMDsKfQ==