#include <memory>
#include <iostream>
using namespace std;
class Obj_1{
public:
int data;
void print() { cout << "this is obj-1" << endl; }
Obj_1():_info("obj-1"),data(0) { cout << "obj-1 -- new" << endl; }
~Obj_1() { cout << "obj-1 -- delete" << endl; }
private:
string _info;
};
class Obj_2{
public:
int data;
void print() { cout << "this is obj-2" << endl; }
Obj_2():_info("obj-2"),data(0) { cout << "obj-2 -- new" << endl; }
~Obj_2() { cout << "obj-2 -- delete" << endl; }
private:
string _info;
};
//-- 环形引用问题 ---
class Obj_b;
class Obj_a{
public:
int data;
void print() { cout << "this is obj-a" << endl; }
Obj_a():_info("obj-a"),data(0) { cout << "obj-a -- new" << endl; }
~Obj_a() { cout << "obj-a -- delete" << endl; }
private:
string _info;
public:
//shared_ptr环形引用
shared_ptr<Obj_b> ptr_objb;
//weak_ptr<Obj_b> ptr_objb;
};
class Obj_b{
public:
int data;
void print() { cout << "this is obj-b" << endl; }
Obj_b():_info("obj-b"),data(0) { cout << "obj-b -- new" << endl; }
~Obj_b() { cout << "obj-b -- delete" << endl; }
private:
string _info;
public:
//shared_ptr环形引用
//shared_ptr<Obj_a> ptr_obja;
weak_ptr<Obj_a> ptr_obja;
};
//-----------------
static int op = 4;
int main(int argc, char* argv[]){
Obj_1 *obj1 = new Obj_1();
Obj_2 *obj2 = new Obj_2();
//1. auto_ptr
/*
独占式 对于同一块内存只能有一个持有者
*/
auto test_auto_ptr = [&] () {
cout << "test_auto_ptr" << endl;
auto_ptr<Obj_1> obj1_ptr(obj1);
obj1_ptr->print();
// auto_ptr<Obj_1> obj1_ptr_b(obj1);
// obj1_ptr_b->print();
auto_ptr<Obj_1> obj1_ptr_c = obj1_ptr;
obj1_ptr_c->print();
obj1_ptr->print();
//cout << obj1_ptr->data << endl;
};
//2. unique_ptr
/*
独占式 对于同一块内存只能有一个持有者
*/
auto test_unique_ptr = [&] () {
cout << "test_unique_ptr" << endl;
unique_ptr<Obj_1> obj1_ptr(obj1);
obj1_ptr->print();
// auto_ptr<Obj_1> obj1_ptr_b(obj1);
// obj1_ptr_b->print();
//unique_ptr<Obj_1> obj1_ptr_c = obj1_ptr; //编译出错,防止控制权转移
unique_ptr<Obj_1> obj1_ptr_c = move(obj1_ptr); //和 auto_ptr<Obj_1> obj1_ptr_c = obj1_ptr 一样的问题
obj1_ptr_c->print();
obj1_ptr->print();
//cout << obj1_ptr->data << endl;
};
//3. shared_ptr
/*
*/
auto test_shared_ptr = [&] () {
cout << "test_shared_ptr" << endl;
shared_ptr<Obj_1> obj1_ptr(obj1);
obj1_ptr->print();
shared_ptr<Obj_1> obj1_ptr_c = obj1_ptr;
obj1_ptr_c->print();
obj1_ptr->print();
cout << obj1_ptr->data << endl;
};
//4. weak_ptr
/*
包裹着shared_ptr, 不会改变shared_ptr的引用计数,可以解决环形引用shared_ptr,导致都无法析构的问题
*/
auto test_weak_ptr = [&] () {
Obj_a* obja = new Obj_a();
Obj_b* objb = new Obj_b();
shared_ptr<Obj_a> ptr_obja(obja);
cout << "#1: " << ptr_obja.use_count() << endl; //1
shared_ptr<Obj_b> ptr_objb(objb);
cout << "#2: " << ptr_objb.use_count() << endl; //1
//制造环形引用条件
ptr_obja->ptr_objb = ptr_objb;
cout << "#22: " << ptr_objb.use_count() << endl; //2
ptr_objb->ptr_obja = ptr_obja;
cout << "#11: " << ptr_obja.use_count() << endl; //2
};
switch(op){
case 1:
test_auto_ptr();
break;
case 2:
test_unique_ptr();
break;
case 3:
test_shared_ptr();
break;
case 4:
test_weak_ptr();
break;
default:
break;
}
cout << "=======================" << endl;
return 0;
}