c++ 智能指针 -- unique_ptr

本文介绍了C++11引入的unique_ptr智能指针,详细阐述了其独占语义,即一个unique_ptr管理的资源不能被其他unique_ptr共享。同时,讲解了unique_ptr如何通过make_unique进行资源创建,以及它如何利用构造函数和删除器管理文件等资源。此外,文章还讨论了unique_ptr对资源所有权的管理,强调了其不支持拷贝但支持移动语义的特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.1 基本语义

c++11 引入unique_ptr智能指针,其对所管理资源拥有独占语义,不能多个多个unique_ptr管理同一个资源,离开其作用域时,会使用与其关联的删除器释放所管理的资源,c++14新增 make_unique工程方法来构造unique_ptr指针,从而避免在程序中显示使用new分配内存。

unique_ptr提供了两个构造函数,用来管理数组或者对象资源,其Deleter模板参数可以指定删除器,用来释放所管理的资源

template<
    class T,
    class Deleter = std::default_delete<T>
> class unique_ptr;

template <
    class T,
    class Deleter
> class unique_ptr<T[], Deleter>;

使用unique_ptr管理文件

#include <iostream>
#include <memory>
using namespace std;
int main(int argc, char** argv)
{
	//构造文件删除器
    auto CloseFile = [](FILE* pFile) { 
        cout << "close file" << endl;
        ::fclose(pFile); 
    };
    //指定删除器
    unique_ptr<FILE, decltype(CloseFile)> pFile(::fopen("./main.cpp", "a+"), CloseFile);
    if (!pFile){
        cout << "open file error"<<endl;
    }
    
    return 0;
}

1.2 unique_ptr对资源所有权的管理

​ unique_ptr对所管理的资源拥有独占权,意味着不能将其赋值给其他对象,因此其copy constructor和assignment constructor都被禁掉了,也意味着不能通过函数值传递unique_ptr对象,也不能通过返回值返回unique_ptr的值。但是unique_ptr支持移动语意,我们可以通过移动语义,交出unique_ptr对资源的占有权,其move constroctor和move assignment operator是放开。

 unique_ptr<FILE, decltype(CloseFile)> filePtr = pFile; //compile filed
 unique_ptr<FILE, decltype(CloseFile)> filePtr = std::move(pFile); //compile success
 unique_ptr<FILE, decltype(CloseFile)> filePtr(std::move(pFIle)) //comple success
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值