#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 unique_ptr by std::move
// Note that return value of a function is a rvalue
static std::unique_ptr<TClass> GetATClass()
{
std::unique_ptr<TClass> c(new TClass(0));
return c; // same as `return std::move(c);`
}
// A function can take a unique_ptr parameter by reference
// but better by const reference
void DoSomething(std::unique_ptr<TClass>& c)
{
c->IntValue = 4;
}
void TestUniquePtrBasicUse()
{
{
TClass c1; // TClass: -1
std::unique_ptr<TClass> c2(new TClass(2)); // TClass: 2
//std::unique_ptr<TClass> c3(c2); // error: use of deleted function
// unique_ptr(const std::unique_ptr&)
std::unique_ptr<TClass> c3; // Empty unique_ptr
//c3 = c2; // error: use of deleted function operator=()
c3 = std::move(c2); // unique_ptr has to be moved
// Now c2 owns nothing
c3 = GetATClass(); // TClass: 0
// ~TClass: 2
DoSomething(c3); // c3->IntValue becomes 4
}
// ~TClass: 4
// ~TClass: -1
}
int main()
{
TestUniquePtrBasicUse();
return 0;
}
I2luY2x1ZGUgPGNzdGRpbz4KI2luY2x1ZGUgPG1lbW9yeT4KIAp1c2luZyBuYW1lc3BhY2Ugc3RkOwogCiNkZWZpbmUgS05PVEUoZm10LCBhcmdzLi4uKSA6OnByaW50ZihmbXQgIlxuIiwgIyNhcmdzKQogCmNsYXNzIFRDbGFzcyB7CnB1YmxpYzoKVENsYXNzKCkKOiBJbnRWYWx1ZSgtMSkgewpLTk9URSgiJXNAJXA6ICVkIiwgX19mdW5jX18sIHRoaXMsIEludFZhbHVlKTsKfQpUQ2xhc3MoaW50IGkpCjogSW50VmFsdWUoaSkgewpLTk9URSgiJXNAJXA6ICVkIiwgX19mdW5jX18sIHRoaXMsIEludFZhbHVlKTsKfQp+VENsYXNzKCkgewpLTk9URSgiJXNAJXA6ICVkIiwgX19mdW5jX18sIHRoaXMsIEludFZhbHVlKTsKfQppbnQgSW50VmFsdWU7Cn07CgoKLy8gQSBmdW5jdGlvbiBjYW4gcmV0dXJuIGEgdW5pcXVlX3B0ciBieSBzdGQ6Om1vdmUKLy8gTm90ZSB0aGF0IHJldHVybiB2YWx1ZSBvZiBhIGZ1bmN0aW9uIGlzIGEgcnZhbHVlCnN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8VENsYXNzPiBHZXRBVENsYXNzKCkKewogIHN0ZDo6dW5pcXVlX3B0cjxUQ2xhc3M+IGMobmV3IFRDbGFzcygwKSk7CiAgcmV0dXJuIGM7IC8vIHNhbWUgYXMgYHJldHVybiBzdGQ6Om1vdmUoYyk7YAp9CgovLyBBIGZ1bmN0aW9uIGNhbiB0YWtlIGEgdW5pcXVlX3B0ciBwYXJhbWV0ZXIgYnkgcmVmZXJlbmNlCi8vIGJ1dCBiZXR0ZXIgYnkgY29uc3QgcmVmZXJlbmNlCnZvaWQgRG9Tb21ldGhpbmcoc3RkOjp1bmlxdWVfcHRyPFRDbGFzcz4mIGMpCnsKICBjLT5JbnRWYWx1ZSA9IDQ7Cn0KCnZvaWQgVGVzdFVuaXF1ZVB0ckJhc2ljVXNlKCkKewogIHsKICAgIFRDbGFzcyBjMTsgLy8gVENsYXNzOiAtMQogICAgc3RkOjp1bmlxdWVfcHRyPFRDbGFzcz4gYzIobmV3IFRDbGFzcygyKSk7IC8vIFRDbGFzczogMgogICAgLy9zdGQ6OnVuaXF1ZV9wdHI8VENsYXNzPiBjMyhjMik7ICAvLyBlcnJvcjogdXNlIG9mIGRlbGV0ZWQgZnVuY3Rpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5pcXVlX3B0cihjb25zdCBzdGQ6OnVuaXF1ZV9wdHImKQoKICAgIHN0ZDo6dW5pcXVlX3B0cjxUQ2xhc3M+IGMzOyAvLyBFbXB0eSB1bmlxdWVfcHRyCgogICAgLy9jMyA9IGMyOyAvLyBlcnJvcjogdXNlIG9mIGRlbGV0ZWQgZnVuY3Rpb24gb3BlcmF0b3I9KCkKICAgIGMzID0gc3RkOjptb3ZlKGMyKTsgLy8gdW5pcXVlX3B0ciBoYXMgdG8gYmUgbW92ZWQKICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm93IGMyIG93bnMgbm90aGluZwoKICAgIGMzID0gR2V0QVRDbGFzcygpOyAvLyBUQ2xhc3M6IDAKICAgICAgICAgICAgICAgICAgICAgICAvLyB+VENsYXNzOiAyCgogICAgRG9Tb21ldGhpbmcoYzMpOyAvLyBjMy0+SW50VmFsdWUgYmVjb21lcyA0CiAgfQogIC8vIH5UQ2xhc3M6IDQKICAvLyB+VENsYXNzOiAtMQp9CgppbnQgbWFpbigpCnsKVGVzdFVuaXF1ZVB0ckJhc2ljVXNlKCk7CnJldHVybiAwOwp9