天天看點

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不允許,因為是獨占的

}