C++自学笔记22(智能指针)

在之前的笔记中讲过new关键字,以及在堆上建立数组,我们说new分配空间,让创建的变量作用域在全局上,而且需要手动delete规定结束位置。会不会写着代码忘记要写delete呢?会的,所以我们还可以使用智能指针unique。

unique_ptr

从英文上讲unique表示唯一,代表了智能指针不可以被复制。为什么?想想下创建AB两个智能指针指向同一个地址,当A指针被销毁时意味着指向的内容也被销毁,那么B指向的就不再是内容而是被销毁的内容。

class Entity
{
public:
    Entity()
        {std::cout<<CreateEntity<<std::endl;}
    ~Entity()
        {std::cout<<DestroyEntity<<std::endl;}
    void Printf(){}
};
int main ()
{
    {
    std::unique_ptr<Entity> e = std::make_unique<Entity>();
    e->printf();
    }

    std::cin.get();
}

 创建Entity类构造与析构函数、printf函数。e->指针调用类内函数。

 std::unique_ptr<Entity> e = std::make_unique<Entity>();就是创建unique_ptr<Entity>指向Entity的智能指针e ,std::make_unique<Entity>();相当于用new创建一个Entity实例指针并分配内存。

达到什么效果呢?在我们创建的作用域下运行到}时,自动调用delete删除指针。

功能类似我们在栈上创建的指针,具体优点参考栈与堆的区别。

shared_ptr

{
    std::unique_ptr<Entity> e = std::make_unique<Entity>();
    std::shared_ptr<Entity> e1 = std::make_shared<Entity>();
    e->printf();
    }
}

    std::shared_ptr<Entity>与std::unique_ptr<Entity>功能上一样但是不同的一点是shared_ptr多出一块内存用来储存引用计数。

std::shared_ptr<Entity> e1 = std::make_shared<Entity>();

代码就是创建了new Entity然后传递给shared_ptr的构造函数,然后一块内存存放控制内存块。

它要怎么用呢?

class Entity
{
public:
    Entity()
        {std::cout<<CreateEntity<<std::endl;}
    ~Entity()
        {std::cout<<DestroyEntity<<std::endl;}
    void Printf(){}
};
int main ()
{
    {
        std::shared_ptr<Entity> e0
        {
        std::shared_ptr<Entity> e = std::make_shared<Entity>();
        e0 = e;
        }//17
    }

    std::cin.get();
}

运行1516行打印CreateEntity,17行时并没有打印DestroyEntity。然而我们让e与e0分享,只有运行到18行时才会打印DestroyEntity。这是因为shared_ptr指针发现有两个指针存在e0 = e分享,所以只有两个都消失时Entity才会被销毁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

少杰是小白

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

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

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

打赏作者

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

抵扣说明:

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

余额充值