C++智能指针:auto_ptr、unique_ptr、shared_ptr、weak_ptr

一、智能指针介绍

智能指针的作用是管理一个指针,因为存在以下这种情况:申请的空间在函数结束时忘记释放,造成内存泄漏。使用智能指针可以很大程度上的避免这个问题,因为智能指针是一个类,当超出了类的实例对象的作用域时,会自动调用对象的析构函数,析构函数会自动释放资源。所以智能指针的作用原理就是在函数结束时自动释放内存空间,不需要手动释放内存空间。智能指针主要用于管理在堆上分配的内存,它将普通的指针封装为一个栈对象。当栈对象的生存周期结束后,会在析构函数中释放掉申请的内存,从而防止内存泄漏。

二、详解

1.auto_ptr

ps:C++98的方案,现在通用的是C++11,最新的是C++20,这个auto_ptr指针现在已经被unique_ptr代替,所以可以忽略掉。

2.unique_ptr

unique是独有特有的意思,所以这个unique_ptr指的是独占式指针,保证同一时间内只有一个指针指向一个对象,并且不能拷贝或者复制给其他对象,其拥有的内存仅自己独占

<1>std::unique_ptr的实现如下:

template 
class unique_ptr
{
    //省略其他代码...

    //拷贝构造函数和赋值运算符被标记为delete
    unique_ptr(const unique_ptr &) = delete;
    unique_ptr &operator=(const unique_ptr &) = delete;
};

<2>初始化一个std::unique_ptr对象方法:

int main()
{
    //方式1
    std::unique_ptr object1(new int(123));
    //方式2
    std::unique_ptr object2;
    object2.reset(new int(123));
    //方式3
    std::unique_ptr object3 = std::make_unique(123);
}

通常用方式3的std::make_unique去创建并初始化一个unique_ptr的对象

<3>std::make_unique的实现如下:

template 
std::unique_ptr make_unique(Ts &&...params)
{
    return std::unique_ptr(new T(std::forward(params)...));
}

<4>std::unique_ptr不仅可以持有一个对象,还可以持有一组对象,实现如下:

#include 
#include 

int main()
{
    //创建10个int类型对象
    //方式1
    std::unique_ptr object1(new int[10]);
    //方式2
    std::unique_ptr object2;
    object2.reset(new int[10]);
    //方式3
    std::unique_ptr object3(std::make_unique(10));

    for (int i = 0; i < 10; ++i)
    {
        object1[i] = i;
        object2[i] = i;
        object3[i] = i;
    }
    std::cout << "begin~" << std::endl;
    for (int i = 0; i < 10; ++i)
    {
        std::cout << object1[i] << " " << object2[i] << " " << object3[i] << std::endl;
    }

    std::cout << "end~" << std::endl;
    return 0;
}

打印如下:

你可能感兴趣的:(C/C++/汇编,c++,指针)