当前位置: 首页 > news >正文

【C++系列】智能指针自定义析构

在 C++ 中,智能指针(如 std::unique_ptr 和 std::shared_ptr)允许自定义析构函数(称为 ​​deleter​​),用于在释放资源时执行特定操作。

1. std::unique_ptr 自定义析构函数

​原理​
std::unique_ptr 的模板包含两个参数:

template<class T, class Deleter = std::default_delete<T>> 
class unique_ptr;
  • Deleter 类型​​:可调用对象(函数、Lambda、函数对象),接收 T* 参数。

  • 示例 1:使用函数作为删除器
#include <iostream>
#include <memory>// 自定义删除函数
void FileDeleter(FILE* file) {if (file) {std::cout << "Closing file\n";fclose(file); // 关闭文件}
}int main() {// 自定义删除器类型: decltype(&FileDeleter)std::unique_ptr<FILE, decltype(&FileDeleter)> file(fopen("test.txt", "w"), FileDeleter // 传入删除器函数);// 当 file 超出作用域时,自动调用 FileDeleter
}
  • 示例 2:使用 Lambda 作为删除器

auto deleter = [](FILE* f) {std::cout << "Lambda closes file\n";if (f) fclose(f);
};int main() {// decltype(deleter) 获取 Lambda 类型std::unique_ptr<FILE, decltype(deleter)> file(fopen("test.txt", "w"), deleter // 传入 Lambda);
}
  • 示例 3:使用函数对象(仿函数)

struct FileDeleter {void operator()(FILE* f) const {std::cout << "Functor closes file\n";if (f) fclose(f);}
};int main() {// 指定删除器类型 FileDeleterstd::unique_ptr<FILE, FileDeleter> file(fopen("test.txt", "w")// 构造时可不显式传递,默认构造删除器对象);
}

 

2. std::shared_ptr 自定义析构函数

​原理​
std::shared_ptr 的删除器通过构造函数传入,​​不影响类型​​,因此更灵活:

template<class Y, class Deleter>
shared_ptr(Y* ptr, Deleter d);

示例:管理动态数组

#include <iostream>
#include <memory>int main() {// 删除器:用 delete[] 释放数组auto deleter = [](int* p) {std::cout << "Deleting array\n";delete[] p;};// 共享指针管理数组std::shared_ptr<int> arr(new int[10], deleter);// 等效写法:直接用 unique_ptr 管理数组// std::unique_ptr<int[]> arr(new int[10]); // 内置数组支持
}

常见应用场景

  • ​文件句柄

std::unique_ptr<FILE, decltype(&fclose)> file(fopen("a.txt", "r"), fclose);
  • 动态数组(需手动释放)
std::shared_ptr<int> arr(new int[10], [](int* p) { delete[] p; });
  •  ​​互斥锁(自动解锁)
std::unique_ptr<std::mutex, std::function<void(std::mutex*)>> lockPtr(&mtx, [](std::mutex* m) { m->unlock(); });
  • ​C 资源(如 OpenSSL 对象)
std::unique_ptr<BIO, decltype(&BIO_free)> bio(BIO_new(...), BIO_free);

关键注意事项

  1. unique_ptr 的删除器是类型的一部分​

    • 不同删除器的 unique_ptr 属于不同类型。
    • 例如:unique_ptr<int, DeleterA> 和 unique_ptr<int, DeleterB> 不兼容。
  2. shared_ptr 的删除器不影响类型​

    • 所有 shared_ptr<T> 无论删除器如何,类型相同。
    • 删除器存储在控制块中,动态调用。
  3. ​空指针与删除器​
    删除器需处理指针为空的情况。

  4. ​性能影响​

    • unique_ptr 的删除器通常无额外开销(可内联)。
    • shared_ptr 的删除器存储在堆上,略有开销。

相关文章:

  • 6.5 自学测试 数据库基础 Day5
  • C++11 右值引用
  • 第十八章 归档与备份
  • python打卡训练营打卡记录day48
  • JS的数据类型分类
  • 自动交换两个文件的文件名 VSB脚本技巧 电脑技巧
  • java面试:JAVA并发篇
  • 《双指针》题集
  • Codeforces Educational 179(ABCDE)
  • 聊聊集群间数据复制和持久化机制
  • 联邦学习与边缘计算结合
  • Ubuntu 上安装 Git LFS
  • 算法打卡17天(补)
  • Docker知识五:服务编排(Docker Compose概念)
  • HTML前端开发:JavaScript的条分支语句if,Switch
  • 矩阵详解:从基础概念到实际应用
  • 对F1分数的基本认识
  • 深入理解 Spring Cache 及其核心注解
  • 电路图识图基础知识-电动机正反转控制电路详解(二十)
  • 关于 ffmpeg设置摄像头报错“Could not set video options” 的解决方法
  • 织梦模板怎么单独做移动端网站/怎么宣传自己的产品
  • 东营网站建设制作/竞价排名点击器
  • 最好的网站模板下载网站/seoul是什么品牌
  • 电脑自带的做网站叫什么软件/怎样自己制作网站
  • 互联网网站建设公司/百度seo点击排名优化
  • 白城网站建设公司/免费行情网站