17 C++ 高级之智能指针

Android Ndk 学习笔记(目录)

#include <iostream>
#include <memory> // 智能指针的头文件引入
using namespace std;



class Person{
public:
    ~Person(){
        cout << "Person  析构函数" <<endl ;
    }
};

// 智能指针
void usePerson(){


    Person * person1 = new Person(); // 堆中开辟的空间
    Person * person2 = new Person();

    // 栈区开辟sharedPtr1,main函数弹栈时,自动弹栈,弹栈时将会person也释放了
    shared_ptr<Person> sharedPtr1(person1);
    shared_ptr<Person> sharedPtr2(person2);
};

class Person2; // 先声明 Person2 让我们的Person1 直接找到

class Person1 {
public:
    shared_ptr<Person2> person2; // Person2智能指针  shared_ptr 引用计数+1
    ~Person1() {
        cout << "Person1 析构函数" << endl;
    }
};

class Person2 {
public:
    shared_ptr<Person1> person1;  // Person1智能指针  shared_ptr 引用计数+1
    ~Person2() {
        cout << "Person2 析构函数" << endl;
    }
};

void usePerson12(){
    Person1 * person1 = new Person1(); // 堆区开辟
    Person2 * person2 = new Person2(); // 堆区开辟

    shared_ptr<Person1> sharedPtr1(person1); // +1 = 1
    shared_ptr<Person2> sharedPtr2(person2); // +1 = 1

    cout << "前 sharedPtr1的引用计数是:" << sharedPtr1.use_count() << endl;
    cout << "前 sharedPtr2的引用计数是:" << sharedPtr2.use_count() << endl;

    // 给Person2智能指针赋值
    person1->person2 = sharedPtr2;
    // 给Person1智能指针赋值
    person2->person1 = sharedPtr1;

    cout << "后 sharedPtr1的引用计数是:" << sharedPtr1.use_count() << endl;
    cout << "后 sharedPtr2的引用计数是:" << sharedPtr2.use_count() << endl;
}

class Person4; // 先声明 Person2 让我们的Person1 直接找到

class Person3 {
public:
    weak_ptr<Person4> person4; // Person2智能指针  没有引用计数 无法+1
    ~Person3() {
        cout << "Person1 析构函数" << endl;
    }
};

class Person4 {
public:
    weak_ptr<Person3> person3;  // Person1智能指针  没有引用计数 无法+1
    ~Person4() {
        cout << "Person2 析构函数" << endl;
    }
};


void usePerson34(){

    Person3 * person3 = new Person3(); // 堆区开辟
    Person4 * person4 = new Person4(); // 堆区开辟

    shared_ptr<Person3> sharedPtr3(person3); // +1 = 1
    shared_ptr<Person4> sharedPtr4(person4); // +1 = 1

    cout << "前 sharedPtr3的引用计数是:" << sharedPtr3.use_count() << endl;
    cout << "前 sharedPtr4的引用计数是:" << sharedPtr4.use_count() << endl;

    // 给Person2智能指针赋值
    person3->person4 = sharedPtr4;
    // 给Person1智能指针赋值
    person4->person3 = sharedPtr3;

    cout << "后 sharedPtr1的引用计数是:" << sharedPtr3.use_count() << endl;
    cout << "后 sharedPtr2的引用计数是:" << sharedPtr4.use_count() << endl;


}
class Person5 {};

void usePerson5(){
    Person5 * person51 = new Person5();
    Person5 * person52 = new Person5();

    std::unique_ptr<Person5> uniquePtr5(person51);
    // std::unique_ptr<Person> uniquePtr6 = uniquePtr5;  unique不允许,因为是独占的

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值