cpp11智能指针

#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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值