【c++ 】智能指针

6d63dc5dd3994f75ae53a20768cc10f6.gif

🏆 个人主页:🎈 @太阳哥哥 🎈

🎁 本文收录专栏:🎈C++学习之路 🎈

🛒 其他专栏:🎈 ARM学习之路 🎈

📝 学习格言:路漫漫其修远兮,吾将上下而求索

💡 欢迎点赞、关注、收藏( •̀ ω •́ )✧   一起努力,一起学习!

目录

🎈 智能指针

🎈  auto_ptr

🎈  unique_ptr

🎈  shared_ptr(共享指针)

🎈  weak_ptr(弱指针)


🎈 智能指针

        裸指针:直接用new返回的指针,强大灵活,但是需要开发者全程维护。

        智能指针:将裸指针开辟的堆空间交给智能指针管理,能够“自动释放所指向的对象内存”。用来帮助我们进行动态分配对象(new出来的对象)的生命周期的管理。能够有效防止内存泄漏。

C++标准库std提供四种智能指针:

  • auto_ptr(自动管理)C++98,已经被unique_ptr取代。

  • unique_ptr(独占式指针)C++11,同一时间内,只有一个指针指向该对象。

  • shared_ptr(共享指针)C++11,共享式指针。多个指针指向同一个对象,最后一个指针被销毁时,这个对象会被销毁。

  • weak_ptr(弱指针)C++11,用来辅助shared_ptr。

🎈  auto_ptr

        auto_ptr用于c++98,是C++11之前的智能指针,c++11中已经被unique_ptr所取代,因为unique_ptr更为严谨。

格式:auto_ptr<类型>对象名(指针对象)

// 定义智能指针
auto_ptr<Test> test(new Test);

atuo_ptr其问题所在:

  • 复制和赋值都会 改变atuo_ptr所指向资源的所有权;

  • 不支持对象数组的操作;

  • 在 STL 容器中使用auto_ptr存在重大风险,因为容器内的元素必需支持可复制和可赋值;

🎈  unique_ptr

        unique_ptr(唯一指针)

        唯一指针也被称为独占式指针,是受限制的共享指针,绑定一个指针指向对象。当对象被销毁时,会在其析构函数中删除原始指针。

特性:

  • 两个指针不能指向同一个资源。

  • 保存指向某个对象的指针,当它本身离开作用域时会自动释放它指向的对象。

  • 无法进行左值unique_ptr复制构造,也无法进行左值复制赋值操作,但允许临时右值赋值构造和赋值。

        格式:unique_ptr<类型>对象名(指针对象)

       
    unique_ptr<Test> test(new Test);

    unique_ptr<int[]> array(new int[5]);//对象数组

🎈  shared_ptr(共享指针)

        shared_ptr智能指针可以在任何地方都不使用时,自动删除相关指针,从而帮助彻底消除内存泄漏和悬空指针的问题。 ​ 它遵循共享所有权的概念,即不同的 shared_ptr 对象可以与相同的指针相关联,并在内部使用引用计数机制来实现这一点。

shared_ptr 对象在内部指向两个内存位置:

        指向对象的指针。

        用于控制引用计数数据的指针,新的shared_ptr在与对象相关联时,其构造函数将与此指针关联的引用计数增加1;当shared_ptr没在作用域时,其构造函数将与此指针关联的引用计数减1。当引用计数为0时,自动调用delete函数释放该内存空间。

shared_ptr成员函数:

  • use_count() 绑定的指针个数。

  • unique() 返回是否是独占所有权( use_count 为 1)

  • swap(shared_ptr对象) 交换两个 shared_ptr 对象(即交换所拥有的对象)

  • reset() 放弃内部对象的所有权或拥有对象的变更。

  • get() 返回内部对象(指针)的地址,。

🎈  weak_ptr(弱指针)

        协助共享指针工作,解决共享指针循环引用的时候会造成资源得不到释放的问题。与共享指针一起使用,作为共享指针的备份,弱指针的存在,不影响共享指针的释放。使用weak_ptr 来打破循环引用,它与一个 shared_ptr 绑定,但却不参与引用计数的计算。

        (1)用shared_ptr进行初始化

        (2)成员函数expired

        (3)用于判断shared_ptr是否被释放

        示例程序:

#include "iostream"
using namespace std;
class Son;
class Father
{
public:
    ~Father()
    {
        cout << "Father释放资源" << endl;
    }
    weak_ptr<Son>son;//弱指针
};
class Son
{
public:
    ~Son()
    {
        cout << "Son释放资源" << endl;
    }
    weak_ptr<Father>father;//弱指针
};
int main()
{
    Father* father2 = new Father();
    Son* son2 = new Son();
    shared_ptr<Father>father1(father2);
    shared_ptr<Son>son1(son2);
    father2->son = son1;
    son2->father = father1;
    cout << "与Father绑定的共享指针的个数:" << father1.use_count() << endl;
    cout << "与Son绑定的共享指针的个数:" << son1.use_count() << endl;
    return 0;
}

        执行程序结果:

与Father绑定的共享指针的个数:1
与Son绑定的共享指针的个数:1
Son释放资源
Father释放资源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

漫漫长夜想学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值