使用示例方式記錄shared_ptr使用方法

#include <memory>
#include <iostream>

// shared_ptr實現共享式擁有概念。
// 多個智能指針可以指向相同對象,該對象和其相關資源會在“最後一個引用被銷燬”時候釋放。
// 從名字share就可以看出了資源可以被多個指針共享,它使用計數機制來表明資源被幾個指針共享。

// share_ptr智能指針還是有內存泄露的情況:
// 當兩個對象相互使用一個shared_ptr成員變量指向對方,會造成循環引用,使引用計數失效,從而導致內存泄漏。
int main() {
    std::cout << "***********************默認初始化爲空***********************" << std::endl;
    std::shared_ptr<std::string> e1;
    std::shared_ptr<std::string> e2(nullptr);
    std::shared_ptr<std::string> e3(new std::string);

    std::cout << "e1 is :" << (e1 ? "not empty" : "empty") << std::endl;
    std::cout << "e2 is :" << (e2 ? "not empty" : "empty") << std::endl;
    std::cout << "e3 is :" << (e3 ? "not empty" : "empty") << std::endl;



    std::cout << "***********************使用*或者->訪問數據***********************" << std::endl;
    std::shared_ptr<std::string> u1(new std::string("test"));
    std::shared_ptr<std::string> u2(new std::string("test"));
    std::cout << "*u1        : " << *u1 << std::endl;
    std::cout << "u2->c_str(): " << u2->c_str() << std::endl;
    


    std::cout << "***********************使用=獲取數據的所有權,共享***********************" << std::endl;
    std::shared_ptr<int> share1(new int(10));
    std::shared_ptr<int> share2 = share1;
    std::cout << "share1:" << *share1 << std::endl;
    std::cout << "share2:" << *share2 << std::endl;



    std::cout << "***********************通過use_count函數查看當前資源被多少個指針引用***********************" << std::endl;
    std::string* str = new std::string("123");
    std::shared_ptr<std::string> c1(str);
    std::cout << "usercount:" << c1.use_count() << std::endl;
    std::shared_ptr<std::string> c2 = c1;
    std::cout << "usercount:" << c1.use_count() << std::endl;
    std::shared_ptr<std::string> c3 = c2;
    std::cout << "usercount:" << c1.use_count() << std::endl;

    // 避免這種用法,不可以將一個資源同時交給多個shared_ptr管理,因爲多個share_ptr是隔離的,所以會導致shared_ptr被析構多次
    /*std::string* str1 = new std::string("t");
    std::shared_ptr<std::string> s3(str1);
    std::cout << s3.use_count() << std::endl;
    std::shared_ptr<std::string> s4(str1);
    std::cout << s3.use_count() << std::endl;
    */



    std::cout << "*******通過reset釋放原有資源的所有權(原資源引用計數爲0時會被釋放),獲取新的資源所有權*******" << std::endl;
    std::shared_ptr<int> res1(new int(10));
    std::shared_ptr<int> res2(res1);
    std::cout << "before reset. res1 use_count:" << res1.use_count() << std::endl;
    std::cout << "before reset. res2 use_count:" << res2.use_count() << std::endl;
    // 釋放原有資源的控制權,獲取新資源的所有權
    res1.reset(new int(20));
    std::cout << "after reset. res1 use_count:" << res1.use_count() << std::endl;
    std::cout << "after reset. res2 use_count:" << res2.use_count() << std::endl;
    
    // 注意reset不允許reset(nullptr),直接使用reset即可
    // res1.reset(nullptr); // 報錯
    res1.reset();
    std::cout << "after res1.reset(),res1.get(): " << res1.get() << std::endl;


    std::cout << "***********************使用get方法獲取原始指針***********************" << std::endl;
    std::shared_ptr<int> g1(new int(10));
    int* iptr = g1.get();
    std::cout << "*iptr:" << *iptr << std::endl;
    std::cout << "g1.use_count():" << g1.use_count() << std::endl;



    std::cout << "***********************使用swap(成員函數和標準庫函數都可以)交換兩個指針的所有權***********************" << std::endl;
    std::shared_ptr<int> swa1(new int(10));
    std::shared_ptr<int> swa2 = swa1;
    std::shared_ptr<int> swa3 = swa1;

    std::shared_ptr<int> swb(new int(20));
    
    std::cout << "before swap. swa3.use_count():" << swa3.use_count() << std::endl;
    std::cout << "before swap. *swa3:" << *swa3 << std::endl;
    std::cout << "before swap. swb.use_count():" << swb.use_count() << std::endl;
    std::cout << "before swap. *swb:" << (*swb) << std::endl;
    swb.swap(swa3);
    std::cout << "after swap. swa3.use_count():" << swa3.use_count() << std::endl;
    std::cout << "after swap. *swa3:" << *swa3 << std::endl;
    std::cout << "after swap. swb.use_count():" << swb.use_count() << std::endl;
    std::cout << "after swap. *swb:" << (*swb) << std::endl;

    // 使用標準庫函數再次進行交換
    std::swap(swa3, swb);
    std::cout << "after swap std::swap. swa3.use_count():" << swa3.use_count() << std::endl;
    std::cout << "after swap std::swap. *swa3:" << *swa3 << std::endl;
    std::cout << "after swap std::swap. swb.use_count():" << swb.use_count() << std::endl;
    std::cout << "after swap std::swap. *swb:" << (*swb) << std::endl;


    std::cout << "****通過unique函數判斷當前指針是否與其他指針共享資源,當且僅當當前指針指向一個沒有被別人指向的資源才返回true****" << std::endl;
    std::shared_ptr<int> un1;
    std::shared_ptr<int> un2(new int);
    std::cout << "uniq1.unique():" << un1.unique() << std::endl;
    un1 = un2;
    std::cout << "uniq1.unique():" << un1.unique() << std::endl;
    un2 = nullptr;
    std::cout << "uniq1.unique():" << un1.unique() << std::endl;



    std::cout << "*************使用make_shared函數創建一個共享指針" << std::endl;
    std::shared_ptr<int> m1 = std::make_shared<int>(10);
    // 上述做法效果等同於:
    std::shared_ptr<int> m2(new int(10));
    std::cout << "*m1:" << *m1 << std::endl;
    std::cout << "*m2:" << *m2 << std::endl;

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章