智能指针学习

本文介绍了C++中的智能指针unique_ptr和shared_ptr,探讨了unique_ptr的独享所有权特性、资源管理和使用方法,以及shared_ptr的共享所有权和引用计数机制。

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

智能指针

unique_ptr

独享的智能指针 删除了拷贝构造函数和赋值函数

  1. 创建std::unique_ptr对象并管理资源:
std::unique_ptr<int> ptr(new int); 
https://www.yuque.com/along-zprci/along/5f7e9308d6435c89909b74f727c3e249?singleDoc

这行代码创建了一个std::unique_ptr对象ptr,并将其指向一个动态分配的int对象。在这种情况下,std::unique_ptr会负责在适当的时候自动释放所管理的资源。

  1. 使用make_unique创建std::unique_ptr对象:
auto ptr = std::make_unique<int>(42);

std::make_unique是一个C++14引入的辅助函数模板,可以更方便地创建std::unique_ptr对象并进行初始化。在上述示例中,我们将ptr初始化为一个值为42的int对象。

  1. 获取被管理资源的指针:
int* rawPtr = ptr.get();

通过调用get()成员函数可以获取被std::unique_ptr管理的资源的原始指针。但是,需要谨慎使用这个原始指针,因为如果std::unique_ptr释放了资源,那么这个原始指针就成为悬空指针了。

  1. 使用*操作符访问被管理资源的值:
int value = *ptr;

通过解引用std::unique_ptr对象,可以访问被管理资源的值。上述示例将所管理的int值赋给了value变量。

  1. 释放资源:
ptr.reset();

通过调用reset()函数可以手动释放所管理的资源,将std::unique_ptr重置为空指针。这将导致资源的销毁和释放。

  1. 重置std::unique_ptr,并接管新的资源:
ptr.reset(new int(99));

reset()函数还可以接受一个新的指针作为参数,用于重置std::unique_ptr并接管新的资源。在上述示例中,ptr被重置为一个指向值为99的新的int对象。

  1. 使用自定义的删除器:
void custom_deleter(int* ptr) {
    delete ptr;
    std::cout << "Custom deleter called." << std::endl;
}

std::unique_ptr<int, decltype(&custom_deleter)> ptr(new int, custom_deleter);
//decltype 可以自动推导表达式的类型

std::unique_ptr的第二个模板参数可以指定一个删除器(deleter)函数或函数对象,用于在释放资源时执行一些特定的操作。在上述示例中,我们使用了一个自定义删除器custom_deleter,当std::unique_ptr释放资源时,会调用该删除器并打印一条消息。

shared_ptr

shared_ptr 是 C++11 引入的智能指针类,它提供了一种共享所有权的指针语义。与 unique_ptr 不同,shared_ptr 允许多个智能指针实例同时指向同一个对象,它通过引用计数的方式来跟踪和管理资源的生命周期。

需要注意的是,shared_ptr 的引用计数不仅仅受到 shared_ptr 对象的控制,还可以通过复制构造函数和赋值运算符对计数进行增加和减少。当最后一个 shared_ptr 实例离开作用域或者被显式地释放时,引用计数降为零时,所拥有的资源会被释放。

ptr.use_count() == 0 // 释放资源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值