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

new一个指针再被智能指针接管和直接调用make_unique有什么区别? (接上篇的未完待续)

上篇代码有错误在本篇幅更正#include iostream #include memory #include vector #include utility #include cstddef #include type_traits //std::enable_if_t!std::is_arrayT::value, int 0 template typename T struct DefaultDelete { //必须加const为了兼容后面const类型的智能指针 void operator()(T* ptr) const { if (ptr) { std::cout use T deleter_() std::endl; delete ptr; } } }; //利用模板的特化去匹配数组类型 template typename T struct DefaultDeleteT[] { void operator()(T *ptr) const { if (ptr) { std::cout use T[] deleter_() std::endl; delete[] ptr; } } }; template typename T, typename Delete DefaultDeleteT class MyUniquePtr { private: T *ptr_; Delete deleter_; public: //允许外部自定义删除类在构造函数这里传入, 所以也需要移动构造删除器 inline explicit MyUniquePtr(T *data, Delete del Delete()) : ptr_(data), deleter_(std::move(del)) { std::cout MyUniquePtrT std::endl; } inline ~MyUniquePtr() noexcept { if (ptr_) { std::cout ~MyUniquePtrT std::endl; deleter_(ptr_); ptr_ nullptr; } } MyUniquePtr(const MyUniquePtr ptr) delete; MyUniquePtr operator(const MyUniquePtr ptr) delete; inline MyUniquePtr(MyUniquePtr other) : ptr_(other.ptr_), deleter_(std::move(other.deleter_)) { other.ptr_ nullptr; } inline MyUniquePtr operator (MyUniquePtr other) { if (this other) { return *this; } reset(other.ptr_); deleter_ std::move(other.deleter_); other.ptr_ nullptr; return *this; } inline T operator* () const noexcept { return *ptr_; } inline T* operator- () const noexcept { return ptr_; } inline explicit operator bool() const noexcept { return (ptr_ ! nullptr); } inline void reset(T *data) { T *tmp ptr_; ptr_ data; if (tmp) { deleter_(tmp); } } T *get_ptr() const noexcept { return ptr_; } }; template typename T, typename Delete class MyUniquePtrT[], Delete { private: T *ptr_; Delete deleter_; public: inline explicit MyUniquePtr(T *data, Delete del Delete()) : ptr_(data), deleter_(std::move(del)) { std::cout MyUniquePtrT[] std::endl; } inline ~MyUniquePtr() noexcept { if (ptr_) { std::cout ~MyUniquePtrT[] std::endl; deleter_(ptr_); ptr_ nullptr; } } MyUniquePtr(const MyUniquePtr ptr) delete; MyUniquePtr operator(const MyUniquePtr ptr) delete; inline MyUniquePtr(MyUniquePtr other) : ptr_(other.ptr_), deleter_(std::move(other.deleter_)) { other.ptr_ nullptr; } inline MyUniquePtr operator (MyUniquePtr other) { if (this other) { return *this; } reset(other.ptr_); deleter_ std::move(other.deleter_); other.ptr_ nullptr; return *this; } inline explicit operator bool() const noexcept { return (ptr_ ! nullptr); } inline void reset(T *data) { T *tmp ptr_; ptr_ data; if (tmp) { deleter_(tmp); } } /* 不用int原因是禁止负索引 */ inline T operator[] (size_t index) const { return ptr_[index]; } T *get_ptr() const noexcept { return ptr_; } }; templatetypename T, typename ... Args, std::enable_if_t!std::is_arrayT::value, int 0 MyUniquePtrT myMakeUnique(Args ... args) { return MyUniquePtrT(new T(std::forwardArgs(args)...)); } templatetypename T, std::enable_if_tstd::is_arrayT::value std::extentT::value 0, int 0 MyUniquePtrT myMakeUnique(size_t size) { return MyUniquePtrT(new std::remove_extent_tT[size]()); } int main() { MyUniquePtrint[] p myMakeUniqueint[](6); MyUniquePtrint a myMakeUniqueint(); }构造函数里面 Delete del Delete() 为什么这样写可以这样写吗 Delete del deleter_因为template typename T, typename Delete DefaultDeleteT 这里typename Delete默认就是DefaultDeleteT 这个类所以说Delete()编译器能找到与之匹配的实体类DefaultDeleteDelete()相当于DefaultDeleteT(), 直接写DefaultDeleteT()也行只不过声明模板时候已经写了默认等于DefaultDeleteT 为了简写直接Delete()就好。Delete del deleter_正确吗本意是用类内默认构造器对象但是问题在于这是在构造函数内部类中变量都没有分配内存完成就直接用整个MyUniquePtr类没有构建出来时候, 也就是没有定义实体对象时候, 也就是MyUniquePtr p; 没有定义对象没有实体内存分配出来时, deleter_没有内存里面的成员变量直接用会导致未定义行为调用Delete类中拷贝构造时候, 用到deleter_入参传入但是deleter连内存都没有, 直接出现了问题所以最好用Delete() 现用现构造技巧(单例模式) 出临时对象, 去拷贝构造给deleterC中make_unique调用函数有啥好处注意C17之前函数参数里面的执行顺序是不确定的, 可能存在交替执行的流程之前的new操作是暴露在外的用effective c中的例子函数声明 int priority(); void processWidget(std::shared_ptrWidget pw, int priority_); 函数调用 processWidget(std::shared_ptrWidget(new Widget), priority()); C17之前参数里的执行顺序是不确定的, 上述代码会有什么问题 执行顺序 1. new Widget堆中构造内存 2. std::shared_ptrWidget智能指针接管 3. priority() 如果真的按照上述流程执行那就没问题, 也即C17现在是没问题的, C17能保证先完成一个参数处理完事再处理下一个参数 但是C17之前 可能会这样执行顺序 1. new Widget堆中构造内存 2. priority() 3. std::shared_ptrWidget智能指针接管 如果priority()函数抛异常 那么堆内存没有被智能指针接管导致内存泄漏这就是问题make_unique优势在哪里能解决上面讨论的这个问题?make_unique利用工厂模式, 用到时候去构造临时对象返回一个对象他把分配堆内存和智能指针接管操作凑在一个函数体执行这样能把他俩操作绑定成一个函数操作processWidget(std::make_uniqueWidget(), priority()); 这样流程会不会有问题执行顺序1. std::make_uniqueWidget()代码执行由于将分配内存和智能指针接管变成一个操作那么不是他先就是priority()先假如1. std::make_uniqueWidget()2. priority()此时priority()抛出异常那么堆内存已经被智能指针接管了不会泄漏然后由于泡异常C能保证函数执行过程中抛异常函数展开栈内存会得到释放所以智能指针对象被析构即堆内存被释放掉所以强异常安全。换个执行顺序同理总之能用make_unique构造智能指针就用他吧

相关文章:

new一个指针再被智能指针接管和直接调用make_unique有什么区别? (接上篇的未完待续)

上篇代码有错误&#xff0c;在本篇幅更正#include <iostream> #include <memory> #include <vector> #include <utility> #include <cstddef> #include <type_traits> //std::enable_if_t<!std::is_array<T>::value, int&…...

Ryujinx模拟器完整指南:在PC上免费畅玩Switch游戏的终极解决方案

Ryujinx模拟器完整指南&#xff1a;在PC上免费畅玩Switch游戏的终极解决方案 【免费下载链接】Ryujinx 用 C# 编写的实验性 Nintendo Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/ry/Ryujinx 你是否曾经梦想在电脑上体验《塞尔达传说&#xff1a;王国…...

为ClaudeCode配置Taotoken作为稳定后备API服务避免中断

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 为ClaudeCode配置Taotoken作为稳定后备API服务避免中断 基础教程类&#xff0c;针对担心Claude Code服务不稳定或配额不足的用户&a…...

Play Integrity API Checker:你的Android设备安全检测终极指南

Play Integrity API Checker&#xff1a;你的Android设备安全检测终极指南 【免费下载链接】play-integrity-checker-app Get info about your Device Integrity through the Play Intergrity API 项目地址: https://gitcode.com/gh_mirrors/pl/play-integrity-checker-app …...

windows VS工具判断动态库是32位还是64位

dumpbin /headers yourfile.dll | findstr "machine"...

如何在Windows任务栏实时监控硬件性能?TrafficMonitor硬件监控插件完整指南

如何在Windows任务栏实时监控硬件性能&#xff1f;TrafficMonitor硬件监控插件完整指南 【免费下载链接】TrafficMonitorPlugins 用于TrafficMonitor的插件 项目地址: https://gitcode.com/gh_mirrors/tr/TrafficMonitorPlugins 还在为复杂的系统监控软件烦恼吗&#xf…...

HS2-HF Patch终极指南:一键解锁完整汉化与去码体验

HS2-HF Patch终极指南&#xff1a;一键解锁完整汉化与去码体验 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch 还在为《Honey Select 2》的语言障碍和功能限制而…...

跨境电商标题焦虑?QA揭秘“批量更新标题“如何拯救你的运营效率

Q1&#xff1a;什么是"批量更新标题"&#xff1f;这玩意儿真的存在吗&#xff1f;Q&#xff1a;小彭&#xff0c;我听说有个功能叫"批量更新标题"&#xff0c;能批量改产品标题&#xff0c;是真的吗&#xff1f;还是又是那种"画大饼"的工具&…...

体验 Taotoken 官方价折扣与活动价带来的实际成本优势

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 体验 Taotoken 官方价折扣与活动价带来的实际成本优势 对于需要频繁调用大模型 API 的开发者和团队而言&#xff0c;成本控制是一个…...

五轴龙门机床厂家推荐,五轴龙门机床哪家好?

五轴龙门机床厂家推荐&#xff0c;五轴龙门机床哪家好&#xff1f;五轴龙门机床性能参数与场景适配分析。五轴龙门机床是高端装备制造的核心加工设备&#xff0c;广泛应用于航空航天、新能源、重工装备等领域。本文基于海天精工、纽威数控、环球工业机械、济南二机床四款主流国…...

centos7启动yum 安装失败原因(个人观点如有错误请指正)

第一步&#xff1a;修复 DNS&#xff08;最关键&#xff09; bash 运行 echo "nameserver 8.8.8.8" >> /etc/resolv.conf echo "nameserver 114.114.114.114" >> /etc/resolv.conf第二步&#xff1a;下载阿里云 CentOS7 国内源 bash 运行 curl…...

【软件架构师-综合题(3)】软件工程知识点

软件工程这一章围绕一个核心问题展开&#xff1a;软件不是靠灵感写出来的&#xff0c;而是要经过需求、设计、实现、验证、演化这一整条工程链路&#xff0c;被稳定地组织起来。 顺着这条链路去整理&#xff0c;第三章更适合分成六个层次来看&#xff1a;先看开发方法和开发模型…...

2026年,探寻靠谱体育器材的终极指南

在追求健康与活力的时代&#xff0c;体育器材成为了我们运动生活中的重要伙伴。但面对市场上琳琅满目的品牌和产品&#xff0c;如何选择靠谱的体育器材成为了许多人的难题。今天&#xff0c;让我们一同探寻 2026 年靠谱体育器材的终极指南。一、品质与口碑沧州九牌体育用品制造…...

关于fiddler报错“The system proxy was changed. click to reenable capturing”的解决办法

背景&#xff1a;第一次下载安装fiddler&#xff0c;安装过程没有任何问题&#xff0c;但启动即报错 参考了很多帖子&#xff0c;一个一个排查后&#xff0c;发现是sslvpn的问题&#xff08;因为访问校园网需要安装了 EasyConnect 深信服SSLVPN客户端&#xff09;&#xff0c;把…...

找不到测试(No tests were found)bug修改

解决办法 两个地方有时候改一个地方就好了改成在in whole project或者Across module dependencies...

不止于看见,更在于改变——双碳传媒的全球工业服务生态

在数字化与智能化重塑世界的今天&#xff0c;传统的工业传播边界正在被打破。双碳传媒&#xff08;秦皇岛&#xff09;有限公司&#xff0c;正以AI技术为核心驱动&#xff0c;重新定义全球工业服务的生态格局。我们深知&#xff0c;服务国家战略与顶级企业&#xff0c;需要的是…...

工业防爆监控技术解析与选型方案 —— 以吉林高危场景为例

一、引言在石油化工、矿山开采、海上作业等工业高危场景中&#xff0c;环境存在易燃易爆、高腐蚀、高粉尘、极端温度等特性&#xff0c;普通安防设备无法满足安全要求。防爆监控作为场景安全防控的核心终端&#xff0c;其技术设计、硬件选型、功能配置直接决定高危场景的风险防…...

22. 与 React 集成

22. 与 React 集成 1. 概述 TypeScript 与 React 的集成是现代前端开发的标准实践。TypeScript 为 React 组件提供了类型安全&#xff0c;帮助在编译时发现错误&#xff0c;提升开发体验和代码质量。 ┌───────────────────────────────────…...

门店数据采集如何做质量控制:LBS、图片质检、去重和人工复核

门店数据采集项目的难点&#xff0c;不是“采不到数据”&#xff0c;而是采回来的数据能不能被业务相信、被系统处理、被管理层复盘。质量控制通常要覆盖位置与时间校验、图片质量检测、图片去重、字段标准化和人工复核。一个全国项目可能涉及几百到几万家门店&#xff0c;图片…...

20. JSX 支持

20. JSX 支持 1. 概述 TypeScript 提供了对 JSX 语法的原生支持&#xff0c;允许在 TypeScript 文件中编写 JSX/TSX 代码。JSX 是一种 JavaScript 的语法扩展&#xff0c;主要用于 React 等框架中描述用户界面。 ┌─────────────────────────────…...

面部美化 API 集成指南

面部美化 API 集成指南 在本教程中&#xff0c;我们将介绍如何集成面部美化 API。该 API 能够准确识别面部特征&#xff0c;并通过用户上传的面部图像实现皮肤平滑、皮肤美白和去痘等美化功能&#xff08;每张图像最多可处理五张面孔&#xff09;。 环境准备 在使用 API 之前…...

从账单明细看 Taotoken 按 Token 计费如何实现成本精细化

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 从账单明细看 Taotoken 按 Token 计费如何实现成本精细化 1. 引言&#xff1a;从模糊估量到精确计量 在接入和使用大模型 API 时&…...

从代购源码到生产环境:反向海淘系统部署与运维实战指南

代码写完之后&#xff0c;真正的考验才刚刚开始。 这是做代购网站开发时经常会遇到的另一个问题——开发的时候感觉一切顺利&#xff0c;一上线就各种出状况。数据库连接数不够、海外用户访问慢、订单高峰期系统卡死……这些问题我在之前的反向海淘项目里都经历过。 这些问题的…...

对比Token Plan与按量计费,如何为你的项目选择更经济的消费模式

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 对比Token Plan与按量计费&#xff0c;如何为你的项目选择更经济的消费模式 对于使用大模型API的开发者而言&#xff0c;成本控制是…...

电玩城新政解读:价格趋势与消费避坑指南

行业现状&#xff1a;一场新规带来的市场洗牌最近&#xff0c;不少玩家发现&#xff0c;常去的那家电玩城变了——以前一块钱两个币&#xff0c;现在一块钱一个币&#xff0c;机器游戏规则也悄悄调整了。这背后&#xff0c;是2024年以来多地密集出台电玩城管理新规带来的连锁反…...

终极游戏库管理器Playnite:一站式管理20+平台游戏的最佳解决方案

终极游戏库管理器Playnite&#xff1a;一站式管理20平台游戏的最佳解决方案 【免费下载链接】Playnite Video game library manager with support for wide range of 3rd party libraries and game emulation support, providing one unified interface for your games. 项目…...

使用Node.js和Taotoken快速构建一个智能客服聊天接口

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 使用Node.js和Taotoken快速构建一个智能客服聊天接口 本教程面向具备Node.js基础的后端开发者&#xff0c;旨在指导你如何使用Open…...

GEO服务商技术评估的四维量化框架:以杭州文澜天下科技为例

评估维度如下。评估维度一&#xff1a;技术自研深度&#xff08;权重30%&#xff09;行业数据显示&#xff0c;当前市场上超千家宣称提供GEO服务的机构中&#xff0c;仅19%拥有完整的自主技术研发团队&#xff0c;超73%的品牌选错服务商&#xff0c;导致二次重构投入成本达到首…...

当Windows 11变得臃肿时:如何用开源工具Win11Debloat重获系统控制权

当Windows 11变得臃肿时&#xff1a;如何用开源工具Win11Debloat重获系统控制权 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to dec…...

HsMod深度解析:基于BepInEx的炉石传说全方位模改进阶指南

HsMod深度解析&#xff1a;基于BepInEx的炉石传说全方位模改进阶指南 【免费下载链接】HsMod Hearthstone Modification Based on BepInEx 项目地址: https://gitcode.com/GitHub_Trending/hs/HsMod 你是否厌倦了炉石传说中繁琐的动画等待&#xff1f;是否渴望更高效的游…...