#include <iostream>
#include <memory>
#include <vector>
using namespace std;
class Test {
public:
int i;
Test(const int &i) : i(i) {}
~Test() { cout << "~Test() : " << this->i << endl; }
void func() { cout << "func() : " << this->i << endl; }
};
class Test2 : public enable_shared_from_this<Test2> {
public:
auto GetSharedPtr() -> decltype(shared_from_this()) {
return shared_from_this();
}
};
void func1() {
Test *pt = new Test(1);
unique_ptr<Test> t1 = make_unique<Test>(2);
t1->func();
auto t2 = move(t1);
auto call = [](Test *t) { t->func(); };
call(t2.get());
cout << "t1.get() : " << t1.get() << endl;
cout << "t2.get() : " << t2.get() << endl;
vector<unique_ptr<Test>> v;
v.emplace_back(new Test(3));
v.back()->func();
throw 1;
delete pt;
}
void func2() {
shared_ptr<Test2> t1 = make_shared<Test2>();
cout << "t1.use_count() : " << t1.use_count() << endl;
{
auto t2(t1);
cout << "t2.use_count() : " << t2.use_count() << endl;
}
auto t3(t1);
cout << "t3.use_count() : " << t3.use_count() << endl;
auto t4(t1->GetSharedPtr());
cout << "t4.use_count() : " << t4.use_count() << endl;
t3.reset();
cout << "t3.get() : " << t3.get() << endl;
cout << "t4.use_count() : " << t4.use_count() << endl;
}
void func3() {
shared_ptr<Test2> s1 = make_shared<Test2>();
cout << "s1.use_count() : " << s1.use_count() << endl;
weak_ptr<Test2> w = s1;
{
auto s2 = w.lock();
cout << "s2.get() : " << s2.get() << endl;
cout << "s1.use_count() : " << s1.use_count() << endl;
}
cout << "s1.use_count() : " << s1.use_count() << endl;
cout << "w.lock() : " << w.lock() << endl;
s1.reset();
cout << "s1.get() : " << s1.get() << endl;
cout << "w.lock() : " << w.lock() << endl;
}
int main() {
try {
func1();
} catch (...) {
}
cout << "------ 1" << endl;
func2();
cout << "------ 2" << endl;
func3();
return 0;
}