C++的智能指针

很久之前,我们说到了new和delete关键字。

new在堆上分配内存,需要delete来删除内存、释放内存,因为它不会自动释放内存。

智能指针是实现过程自动化的一种方式,即当我们调用new时,我们不需要调用delete关键字。

在很多情况下我们甚至不需要调用new。

智能指针实际上是一个原始指针的包装,当我们创建一个智能指针,它会调用new并为我们分配内存,然后基于我们使用的智能指针,这些内存会在某一时刻自动释放。

我们首先来了解一下unique_ptr

unique_ptr是作用域指针,是超出作用域时他会被销毁,然后调用delete

我们不可以复制一个unique_ptr,因为如果复制一个unique_ptr,那么我们就有两个指针指向了同一块内存地址。如果其中一个die了,那么它就会释放这段内存,也就是说,指向同一块内存的第二个unique_ptr指向了被释放的内存,所以我们不可以复制unique_ptr。

注意:要访问智能指针,我们需要memory头文件

复制代码
#include<iostream>
#include<string>
#include<memory>


class Entity
{
public:
    Entity()  //构造函数
    {
        std::cout<<"Create Entity!"<<std::endl;
    }
    ~Entity()  //析构函数
    {
        std::cout<<"Destory Entity!"<<std::endl;
    }
    void Print(){}
};

int main()
{
    {
        // std::unique_ptr<Entity> entity(new Entity()); 
        //entity=new Entity是不可以的,因为unique_ptr需要显式地调用
        //尖括号的Entity是unique_ptr的模版,entity是unique_ptr的名字
        std::unique_ptr<Entity> entity = std::make_unique<Entity>();
        //推荐,因为如果构造函数抛出异常,这种方式会稍微安全一些,因为我们不会得到一个没有引用的悬空指针从而造成内存泄露
        entity->Print();//我们可以调用想要的任何方法 
    }
    std::cin.get();
}

共享指针shared_ptr的工作方式是通过引用计数,引用计数基本上是一种方法,可以跟踪我们的指针有多少个引用,一旦引用计数达到0,它就被删除了

shared_ptr需要分配一块内存,叫做控制块,用来存储引用计数

弱指针weak_ptr

相关推荐
为何创造硅基生物25 分钟前
C语言 结构体内存对齐规则(通俗易懂版)
c语言·开发语言
吃好睡好便好26 分钟前
在Matlab中绘制横直方图
开发语言·学习·算法·matlab
星寂樱易李36 分钟前
iperf3 + Python-- 网络带宽、网速、网络稳定性
开发语言·网络·python
仰泳之鹅1 小时前
【C语言】自定义数据类型2——联合体与枚举
c语言·开发语言·算法
之歆1 小时前
DAY_12JavaScript DOM 完全指南(二):实战与性能篇
开发语言·前端·javascript·ecmascript
于小猿Sup2 小时前
VMware在Ubuntu22.04驱动Livox Mid360s
linux·c++·嵌入式硬件·自动驾驶
cen__y2 小时前
Linux12(Git01)
linux·运维·服务器·c语言·开发语言·git
AI人工智能+电脑小能手2 小时前
【大白话说Java面试题 第65题】【JVM篇】第25题:谈谈对 OOM 的认识
java·开发语言·jvm
社交怪人3 小时前
【算平均分】信息学奥赛一本通C语言解法(题号2071)
c语言·开发语言
郭涤生4 小时前
不同主机之间网络通信-以太网连接复习
开发语言·rk3588