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

大连网站建设 选领超科技百度关键词首页排名服务

大连网站建设 选领超科技,百度关键词首页排名服务,高端的佛山网站建设,b2c网站建设平台自助在 C 中,智能指针(如 std::unique_ptr 和 std::shared_ptr)允许自定义析构函数(称为 ​​deleter​​),用于在释放资源时执行特定操作。 1. std::unique_ptr 自定义析构函数 ​​原理​​ std::unique_pt…

在 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 的删除器存储在堆上,略有开销。
http://www.dtcms.com/wzjs/437188.html

相关文章:

  • 网站域名跳转代码全球网络营销公司排名
  • win7如何建设免费网站东莞营销网站建设
  • 上海门户网站建设方案刷僵尸粉网站推广
  • 中小企业建网站注意苏州seo招聘
  • 国外做化工产品的网站杭州seo推广排名稳定
  • 承德很好的网络建站电商seo是指
  • wordpress自主注册seo推广培训
  • 免费网站排名优化网站关键词优化排名怎么做
  • 服务好的做培训网站pageadmin建站系统
  • 网站制作建设哪家公司好品牌推广策略包括哪些内容
  • 专业的外贸网站建设三只松鼠搜索引擎推广
  • 企业网站备案收费百度竞价推广效果好吗
  • 网站开发的一般流程站长seo
  • 天水建设局网站渣土治理关键词优化seo外包
  • Python用数据库做网站正规电商平台有哪些
  • 章丘营销型网站设计公司网络推广方式有哪几种
  • 哪个网站能在百度做推广爱站关键词搜索
  • 怎么建设影视网站自媒体人15种赚钱方法
  • 甘肃商城网站建设营销技巧和话术
  • flash做网站的流程网站提交收录软件
  • 襄阳做网站排行榜济宁做网站的电话
  • c 网站开发平台太原关键词排名推广
  • 一学一做看视频网站b站广告投放平台入口
  • 卡盟网站建设公司b2b平台有哪些平台
  • 网上挣钱做seo前景怎么样
  • 新余做网站的如何制作网站
  • 网站注册页面怎么做网页seo
  • 移动端的网站怎么做的凡科建站多少钱
  • web网站开发全过程新闻头条今日新闻60条
  • 画册设计素材企业seo自助建站系统