智能指针

  • 什么是智能指针:

    智能指针就是可以自己进行指针地址的创建和销毁的指针,在智能指针中,当需要开辟空间时它可以自己new一个空间来调用地址,并且在不需要的时候或者空着的时候自动delete内存空间。在使用智能指针时我们基本不需要使用new,所以智能指针的代码风格也很工整清爽。在编写代码时可以自动化管理内存。

  • 智能指针的分类(智能指针包含在memory头文件中):

    • unique_ptr(作用域指针):unique_ptr只能有一个,不能复制一个一样的指针,否则有其中一个释放时,另一个就会指向那个被释放的区域,会报错。在使用unique_ptr时我们对类的实例化过程时只能显示构造函数,不能进行隐式构造
    • 语法:std::unique_ptr<参数模板> 名字 =std::make_unique<参数模板>();

    例子如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    #include <iostream>
    #include <memory>

    class Entity
    {
    public:
    Entity()
    {
    std::cout << "Creat a Entity!" << std::endl;
    }

    ~Entity()
    {
    std::cout << "Destory a Entity!" << std::endl;
    }

    Print()
    {
    std::cout << "This is an Entity!" << std::endl;
    }
    }

    int main ()
    {
    {
    std::unique_ptr<Entity> entity(new Entity());//第一种创建方法
    std::unique_ptr<Entity> entity = std::make_unique<Entity>();//第二种创建方法(有时可能出于异常时使用此方法,即由于构造函数出现异常时指针会为空)

    entity->Print();//像正常函数一样调用即可
    }//当离开这个作用域时这个指针会自动销毁
    }

    • shared_ptr(共享指针):sharing_ptr的使用取决于使用的编译器和其中的标准库,大多数情况下,他是作为引用计数(一种用来统计你的指针有多少引用的方法)在引用计数中一旦计数为0则会自动销毁。例如用了两次sharing_ptr则引用计数为2,如果其中一个被释放了那么为1,直到最后一个也被释放才会自动销毁。
    • 语法:std::shared_ptr<参数模板> 名字 =std::make_shared<参数模板>();

    例子如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    #include <iostream>
    #include <memory>

    class Entity
    {
    public:
    Entity()
    {
    std::cout << "Creat a Entity!" << std::endl;
    }

    ~Entity()
    {
    std::cout << "Destory a Entity!" << std::endl;
    }

    Print()
    {
    std::cout << "This is an Entity!" << std::endl;
    }
    }

    int main ()
    {
    {
    std::shared_ptr<Entity> e0;
    {
    //std::shared_ptr<Entity> entity(new Entity());//第一种创建方法
    std::shared_ptr<Entity> entity = std::make_shared<Entity>();//第二种创建方法,在这种方法中不写new是因为异常安全
    e0 = entity;//支持复制
    }//在出这个作用域时entity就会销毁,但是e0依旧存活
    }
    }

    • weak_ptr:一般与shared_ptr连用,因为当shared_ptr赋值给weak_ptr时不会增加引用次数,这样可以通过weak_ptr去判断底层对象是否还存在。所有有可能weak_ptr会指向一个无效对象。

    资料来源

    youtube上the cherno的c++系列