【C++11】unique_ptr

目的

  1. 一块内存只能一个独占智能指针管理
  2. 其他都与shared_ptr类似

表示方式

  1. unique_ptr的初始化
//构造函数初始化
unique_ptr<int> ptr1(new int(10));
//移动初始化
unique_ptr<int> ptr2 = move(ptr1);
//函数返回值(将亡值)初始化
unique_ptr<int> ptr3 = init();
//reset初始化
ptr3.reset(new int(250));
  1. unique_ptr的使用
//获取原始指针,通过get()方法获取地址,*获取值
 unique_ptr<Test> class_ptr2(new Test);
 Test* t = class_ptr2.get();//get()智能指针的成员函数,通过.获取
 t->setValue(25);
 t->display();
 //直接通过智能指针访问
 class_ptr2->setValue(44);//指针方式->获取
 class_ptr2->display();
  1. unique_ptr的删除器
unique_ptr<Test[]> ptr4(new Test[3]);

细节

  1. unique_ptr是引用计数最大为1的share_ptr,很多操作都类似
  2. unique_ptr初始化只能通过移动语义赋值,原因就是资源是独占的,不能赋值
  3. C++11后,unique_ptr和shared_ptr的删除器均支持数组地址的释放

举例

#include <bits/stdc++.h>
using namespace std;
class Test
{
public:
    Test() 
    {
        cout << "construct Test..." << endl;
    }
    Test(int x) 
    {
        cout << "construct Test, x = " << x << endl;
    }
    Test(string str) 
    {
        cout << "construct Test, str = " << str << endl;
    }
    ~Test()
    {
        cout << "destruct Test ..." << endl;
    }
    void setValue(int v){
        m_num = v;
    }
    void display(){
        cout << "成员变量m_num:" << m_num << endl;
    }
private:
    int m_num;
};
unique_ptr<int> init(){
    return unique_ptr<int>(new int(22));//函数返回独占指针,此时该指针的生命周期即将被析构,它对资源的所有权将要消失,因此可以赋值给其他独占指针
}
int main(){
    cout << "----------------独占智能指针的初始化-----------------" << endl;
    //构造函数初始化
    unique_ptr<int> ptr1(new int(10));
    // unique_ptr<int> ptr2 = ptr1;//error,独占智能指针不能通过赋值方式,因为是独占的
    cout << "ptr1的值:" << *ptr1 << endl;
    //移动初始化
    unique_ptr<int> ptr2 = move(ptr1);
    cout << "移动初始化,ptr2的值:" << *ptr2 << endl;
    //函数返回值(将亡值)初始化
    unique_ptr<int> ptr3 = init();
    cout << "函数返回值初始化,ptr3的值:" << *ptr3 << endl;
    //reset初始化
    ptr3.reset(new int(250));
    cout << "reset()初始化,ptr3的值:" << *ptr3 << endl;

    cout << "----------------独占智能指针的使用,与shared_ptr相同-----------------" << endl;
    //获取原始指针,通过get()方法获取地址,*获取值
    unique_ptr<Test> class_ptr2(new Test);
    Test* t = class_ptr2.get();//get()智能指针的成员函数,通过.获取
    t->setValue(25);
    t->display();
    //直接通过智能指针访问
    class_ptr2->setValue(44);//指针方式->获取
    class_ptr2->display();

    cout << "----------------独占智能指针,共享智能指针的删除器-----------------" << endl;
    //c++11之后,独占智能指针,共享智能指针的删除器是可以管理数组的地址的
    // unique_ptr<Test[]> ptr4(new Test[3]);
    shared_ptr<Test[]> ptr5(new Test[3]);
    // system("pause");
    return 0;
}

运行结果

在这里插入图片描述

参考学习

https://www.bilibili.com/video/BV1bX4y1G7ks

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
unique_ptrC++11 标准提供的智能指针,用于管理动态分配的对象。它使用了独占所有权的概念,保证了在不再需要指针时自动释放资源,从而避免了内存泄漏。 手撕 unique_ptr 的实现涉及到指针的拷贝和移动语义。下面是一个简单的手撕 unique_ptr 的示例代码: ```cpp template <typename T> class unique_ptr { public: explicit unique_ptr(T* ptr = nullptr) : ptr_(ptr) {} ~unique_ptr() { delete ptr_; } unique_ptr(const unique_ptr&) = delete; // 禁用拷贝构造函数 unique_ptr& operator=(const unique_ptr&) = delete; // 禁用拷贝赋值运算符 unique_ptr(unique_ptr&& other) noexcept : ptr_(other.ptr_) { other.ptr_ = nullptr; } unique_ptr& operator=(unique_ptr&& other) noexcept { if (this != &other) { delete ptr_; ptr_ = other.ptr_; other.ptr_ = nullptr; } return *this; } T& operator*() const { return *ptr_; } T* operator->() const { return ptr_; } T* get() const { return ptr_; } private: T* ptr_; }; ``` 上述代码中,我们定义了一个类模板 `unique_ptr`,它模拟了标准库中的 `std::unique_ptr` 功能。在构造函数中,我们接受一个指针作为参数,并将其保存在 `ptr_` 成员变量中。析构函数负责释放指针所指向的资源。为了遵循独占所有权的原则,我们禁用了拷贝构造函数和拷贝赋值运算符,而使用移动语义来实现赋值操作。`operator*` 和 `operator->` 用于重载解引用操作符,方便使用指针指向的对象。 需要注意的是,上述实现只是一个简单的手撕版 unique_ptr,并没有处理更复杂的边界情况和异常安全性。在实际使用中,建议使用标准库提供的 `std::unique_ptr`,它已经经过了充分测试和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值