使用示例方式记录shared_ptr使用方法

本文详细介绍了C++11中的智能指针shared_ptr的使用方法,包括构造、拷贝、赋值、解引用以及如何正确管理资源。通过实例展示了shared_ptr在动态内存管理中的优势,帮助读者掌握这一重要的现代C++特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值