#include <cstdio>
#include <memory>
using namespace std;
#define KNOTE(fmt, args...) ::printf(fmt "\n", ##args)
class TClass {
public:
TClass()
: IntValue(-1) {
KNOTE("%s@%p: %d", __func__, this, IntValue);
}
TClass(int i)
: IntValue(i) {
KNOTE("%s@%p: %d", __func__, this, IntValue);
}
~TClass() {
KNOTE("%s@%p: %d", __func__, this, IntValue);
}
int IntValue;
};
// A function can return a shared_ptr
shared_ptr<TClass> GetATClass()
{
auto c = std::make_shared<TClass>(0);
return c;
}
// A function can take a shared_ptr parameter by value
// but better by const reference
void DoSomething(shared_ptr<TClass> c) /* Better const shared_ptr<TClass>& */
{
c->IntValue = 4;
}
void BasicUse()
{
{
TClass c1; // TClass: -1
std::shared_ptr<TClass> c2(new TClass(2)); // TClass: 2
std::shared_ptr<TClass> c3 = std::make_shared<TClass>(3); // TClass: 3
{
std::shared_ptr<TClass> c4;
c4.reset(new TClass(4)); // TClass: 4
if (c4) {
c4->IntValue = 5;
}
c4.reset(); // ~TClass: 5
if (!c4) {
KNOTE("c4 becomes null");
}
}
c3 = GetATClass(); // c3's object is deleted and re-created
// TClass: 0
// ~TClass: 3
DoSomething(c3); // c3->IntValue becomes 4
c3.reset(); // ~TClass: 4
c3 = c2; // Now c3 and c2 share ownership of TClass
DoSomething(c3); // c2/c3 ->IntValue becomes 4
}
// c3, c2, c1 out of scope
// ~TClass: 4
// ~TClass: -1
}
int main()
{
BasicUse();
return 0;
}
I2luY2x1ZGUgPGNzdGRpbz4KI2luY2x1ZGUgPG1lbW9yeT4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIEtOT1RFKGZtdCwgYXJncy4uLikgOjpwcmludGYoZm10ICJcbiIsICMjYXJncykKCmNsYXNzIFRDbGFzcyB7CnB1YmxpYzoKICBUQ2xhc3MoKQogICAgOiBJbnRWYWx1ZSgtMSkgewogICAgS05PVEUoIiVzQCVwOiAlZCIsIF9fZnVuY19fLCB0aGlzLCBJbnRWYWx1ZSk7CiAgfQogIFRDbGFzcyhpbnQgaSkKICAgIDogSW50VmFsdWUoaSkgewogICAgS05PVEUoIiVzQCVwOiAlZCIsIF9fZnVuY19fLCB0aGlzLCBJbnRWYWx1ZSk7CiAgfQogIH5UQ2xhc3MoKSB7CiAgICBLTk9URSgiJXNAJXA6ICVkIiwgX19mdW5jX18sIHRoaXMsIEludFZhbHVlKTsKICB9CiAgaW50IEludFZhbHVlOwp9OwoKLy8gQSBmdW5jdGlvbiBjYW4gcmV0dXJuIGEgc2hhcmVkX3B0cgpzaGFyZWRfcHRyPFRDbGFzcz4gR2V0QVRDbGFzcygpCnsKICBhdXRvIGMgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRDbGFzcz4oMCk7CiAgcmV0dXJuIGM7Cn0KCi8vIEEgZnVuY3Rpb24gY2FuIHRha2UgYSBzaGFyZWRfcHRyIHBhcmFtZXRlciBieSB2YWx1ZQovLyBidXQgYmV0dGVyIGJ5IGNvbnN0IHJlZmVyZW5jZQp2b2lkIERvU29tZXRoaW5nKHNoYXJlZF9wdHI8VENsYXNzPiBjKSAvKiBCZXR0ZXIgY29uc3Qgc2hhcmVkX3B0cjxUQ2xhc3M+JiAqLwp7CiAgYy0+SW50VmFsdWUgPSA0Owp9Cgp2b2lkIEJhc2ljVXNlKCkKewogIHsKICAgIFRDbGFzcyBjMTsgLy8gVENsYXNzOiAtMQogICAgc3RkOjpzaGFyZWRfcHRyPFRDbGFzcz4gYzIobmV3IFRDbGFzcygyKSk7IC8vIFRDbGFzczogMgogICAgc3RkOjpzaGFyZWRfcHRyPFRDbGFzcz4gYzMgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRDbGFzcz4oMyk7IC8vIFRDbGFzczogMwogICAgewogICAgICBzdGQ6OnNoYXJlZF9wdHI8VENsYXNzPiBjNDsKICAgICAgYzQucmVzZXQobmV3IFRDbGFzcyg0KSk7IC8vIFRDbGFzczogNAogICAgICBpZiAoYzQpIHsKICAgICAgICBjNC0+SW50VmFsdWUgPSA1OwogICAgICB9CiAgICAgIGM0LnJlc2V0KCk7IC8vIH5UQ2xhc3M6IDUKICAgICAgaWYgKCFjNCkgewogICAgICAgIEtOT1RFKCJjNCBiZWNvbWVzIG51bGwiKTsKICAgICAgfQogICAgfQogICAgYzMgPSBHZXRBVENsYXNzKCk7IC8vIGMzJ3Mgb2JqZWN0IGlzIGRlbGV0ZWQgYW5kIHJlLWNyZWF0ZWQKICAgICAgICAgICAgICAgICAgICAgICAvLyBUQ2xhc3M6IDAKICAgICAgICAgICAgICAgICAgICAgICAvLyB+VENsYXNzOiAzCiAgICBEb1NvbWV0aGluZyhjMyk7IC8vIGMzLT5JbnRWYWx1ZSBiZWNvbWVzIDQKICAgIGMzLnJlc2V0KCk7ICAvLyB+VENsYXNzOiA0CiAgICBjMyA9IGMyOyAvLyBOb3cgYzMgYW5kIGMyIHNoYXJlIG93bmVyc2hpcCBvZiBUQ2xhc3MKICAgIERvU29tZXRoaW5nKGMzKTsgLy8gYzIvYzMgLT5JbnRWYWx1ZSBiZWNvbWVzIDQKICB9CiAgLy8gYzMsIGMyLCBjMSBvdXQgb2Ygc2NvcGUKICAvLyB+VENsYXNzOiA0CiAgLy8gflRDbGFzczogLTEKfQoKaW50IG1haW4oKQp7CiAgQmFzaWNVc2UoKTsKICByZXR1cm4gMDsKfQ==