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

本文详细介绍了C++中的四种智能指针:auto_ptr(已被弃用)、unique_ptr(独占式指针)、shared_ptr(共享式指针)和weak_ptr(弱引用指针)。智能指针用于自动管理内存,防止内存泄漏。unique_ptr不可复制,通过std::move转移所有权;shared_ptr可共享资源,通过引用计数管理内存,提供use_count()方法查看引用计数;weak_ptr则不控制资源生命周期,用于解决智能指针相互引用导致的死锁问题。
摘要由CSDN通过智能技术生成

一、智能指针介绍

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

二、详解

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 T>
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<int> object1(new int(123));
    //方式2
    std::unique_ptr<int> object2;
    object2.reset(new int(123));
    //方式3
    std::unique_ptr<int> object3 = std::make_unique<int>(123);
}

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

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

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

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

#include <memory>
#include <iostream>

int main()
{
    //创建10个int类型对象
    //方式1
    std::unique_ptr<int[]> object1(new int[10]);
    //方式2
    std::unique_ptr<int[]> object2;
    object2.reset(new int[10]);
    //方式3
    std::unique_ptr<int[]> object3(std::make_unique<int[]>(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;
}

打印如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值