C++之智能指针

why:为何要有智能指针

当我们在堆上使用一块内存的时候,需要new和delete。但是,通常在一块地方new的内存,会忘记delete,或者说申请了很多内存确记不清楚,何时何地去释放它们。

what:什么是智能指针

所以智能指针就横空出世了,只要你把这块内存交给它托管,当生命周期结束的时候,由它自己去释放这块内存。

智能指针的分类

unique_ptr、shared_ptr、weak_ptr.

how:怎么用智能指针

unique_ptr

顾名思义,唯一的,不能复制的智能指针

show your code

#include<iostream>
#include<memory>

class text
{
private:
    /* data */
public:
    text(/* args */);
    ~text();
};

text::text(/* args */)
{
    std::cout << "Created" << std::endl;
}

text::~text()
{
    std::cout << "Destroy" << std::endl;    
}


int main()
{

    std::unique_ptr<text> m(new text());

    std::unique_ptr<text> te = m;//这里会报错
    return 0;

}

只需要将new出来的内存交给智能指针,剩下的都不用管了。

为什么会报错,让我们看一下源码。

unique_ptr里,将拷贝构造给禁止了,人家就不允许拷贝,我这是unique我是唯一的。

shared_ptr

如果你的数据需要你共享内存,只有一个指针指向这里并不能很好的处理数据,OK,那就用shared_ptr。

内部机制是引用计数,有两个人同时入住同一户房子,现在租客有两个,当一个人搬走了,引用计数也就为1,又搬来两个人,此时引用计数为3。当所有人都搬走时,引用计数为0,此时对这段内存delete。

 show  you code

#include<iostream>
#include<memory>

class text
{
private:
    /* data */
public:
    text(/* args */);
    ~text();
};

text::text(/* args */)
{
    std::cout << "Created" << std::endl;
}

text::~text()
{
    std::cout << "Destroy" << std::endl;    
}


int main()
{

    {
        std::shared_ptr<text> t0;
        {
            std::shared_ptr<text> t1 = std::make_shared<text>();
            t0 = t1;
        }
    }

    return 0;

}

t0和t1指向同一块内存,当t1的生命周期结束时,text不会打印Destroy,因为引用计数还不为0,t0还依然指向它,可是,当t0的生命周期也结束了,那么这块内存就被释放了,此时打印Destroy。

weak_ptr

辅助,纯纯的辅助,嗯.....怎么不算辅助呢?

它可以和shared_ptr一起用,目的就是为了获取我shared_ptr还有多少引用计数,我这个智能指针还能不能用,说是辅助也行,更像是一个查询工具。

作为一个查询工具,本身不具备实体,指向同一块内存也不会增加引用计数。

都看到这里了,点个赞再走吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值