#include <iostream>
#include <memory>
struct S { S(int val = 0) : i(val) {} int i; };
struct T
{
T(int Sp = 0) { c = std::shared_ptr<S>(new S(Sp)); }
// Copy constructor; 'make_shared' is used instead of 'new' to construct a new object
T(const T& rhs) : c(std::make_shared<S>(*rhs.c)) { }
// Assignment operator
T& operator= (T &rhs) {
std::swap(this->c, rhs.c);
return *this;
}
std::shared_ptr<S> c;
};
int main()
{
T objectA(1);
// Copy constructor; no resources are shared!
T objectB = objectA;
std::cout << std::hex << objectA.c.get() << std::endl;
std::cout << objectB.c.get() << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgoKc3RydWN0IFMgeyBTKGludCB2YWwgPSAwKSA6IGkodmFsKSB7fSBpbnQgaTsgfTsKCnN0cnVjdCBUCnsKCVQoaW50IFNwID0gMCkgeyBjID0gc3RkOjpzaGFyZWRfcHRyPFM+KG5ldyBTKFNwKSk7IH0KCgkvLyBDb3B5IGNvbnN0cnVjdG9yOyAnbWFrZV9zaGFyZWQnIGlzIHVzZWQgaW5zdGVhZCBvZiAnbmV3JyB0byBjb25zdHJ1Y3QgYSBuZXcgb2JqZWN0CglUKGNvbnN0IFQmIHJocykgOiBjKHN0ZDo6bWFrZV9zaGFyZWQ8Uz4oKnJocy5jKSkgeyB9CgoJLy8gQXNzaWdubWVudCBvcGVyYXRvcgoJVCYgb3BlcmF0b3I9IChUICZyaHMpIHsKCQlzdGQ6OnN3YXAodGhpcy0+YywgcmhzLmMpOwoJCXJldHVybiAqdGhpczsKCX0KCglzdGQ6OnNoYXJlZF9wdHI8Uz4gYzsKCn07CgppbnQgbWFpbigpCnsKCVQgb2JqZWN0QSgxKTsKCgkvLyBDb3B5IGNvbnN0cnVjdG9yOyBubyByZXNvdXJjZXMgYXJlIHNoYXJlZCEKCVQgb2JqZWN0QiA9IG9iamVjdEE7CgoJc3RkOjpjb3V0IDw8IHN0ZDo6aGV4IDw8IG9iamVjdEEuYy5nZXQoKSA8PCBzdGQ6OmVuZGw7CglzdGQ6OmNvdXQgPDwgb2JqZWN0Qi5jLmdldCgpIDw8IHN0ZDo6ZW5kbDsKfQo=