Smart pointers

2023-12-02 00:08
文章标签 smart pointers

本文主要是介绍Smart pointers,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Smart pointers基本模型
template <class T>
class SmartPtr
{
public:
explicit SmartPtr(T* pointee):pointee_(pointee);
SmartPtr &operator=(const SmartPtr&other);
~SmartPtr();
T& operator*()const{
...
return *pointee_;
}
T* operator->()const{
...
return pointee_;
}
private:
T * pointee_;
...


}
class Widget
{
public:
void Fun();
};
SmartPtr<Widget>sp(new Widget);
sp->Fun();
(*sp).Fun();


Widget *p=new Widget;
p=0;//导致资源泄漏
因为具备value语义,所以避免bug,细分了很多种类的SmartPtr; 


SmartPtr只保留必要的成员函数,以区分于类
template<class T>T * GetImpl(SmartPtr<T>&sp);
template<class T>T *& GetImplRef(SmartPtr<T>&sp);
template<class T>void Reset(SmartPtr<T>&sp ,T* source);
template<class T>void Release(SmartPtr<T>&sp,T*&destination);


SmartPtr 没有copy函数,而用Clone函数,以是Value语义具备继承多态特性


SmartPtr 引用计数采用双向链表存储,指向同一个对象


摧毁式拷贝
template<class T>
class SmartPtr
{
public:
SmartPtr(SmartPtr&src)
{
pointee_=src.pointee_;
src.pointee_=0;
}
SmartPtr&operator=(SmartPtr& src)
{
if(this != &src)
{
delete pointee_;
pointee_=src.pointee_;
src.pointee_=0;
}
return *this;
}
}
摧毁式拷贝不能存储于容器内,容易形成null指针


SmartPtr不重载unary operator&


SmartPtr拒绝隐式转换,可以显示手动转换接口
template<T>
class SmartPtr
{
public:
operator T*()
{
return pointee_;
}
operator void*()
{
return pointee_;
}
}
禁止delete SmartPtr

这篇关于Smart pointers的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/443208

相关文章

2024/9/8 c++ smart

1.通过自己编写的class来实现unique_ptr指针的功能 #include <iostream> using namespace std; template<class T> class unique_ptr { public:         //无参构造函数         unique_ptr();         //有参构造函数         unique_ptr(

idea插件【1】Smart Tomcat

一、简介 在开发过程中除了springboot项目支持jar运行,很多场景下需要使用到tomcat外置服务部署,此时我们可以使用idea插件Smart Tomcat (Smart Tomcat 插件是一个用于简化与 Tomcat 服务器交互的工具,它提供了一些额外的功能来增强开发体验)帮助我们进行快速的服务部署与调试 二、集成 1. 安装Smart Tomcat 在idea plugin

Leetcode211: Populating Next Right Pointers in Each Node II

Follow up for problem "Populating Next Right Pointers in Each Node". What if the given tree could be any binary tree? Would your previous solution still work? Note: You may only use constant e

【Web3初识系列】如何连接 Binance Smart Chain通过交易对绘制 k 线?

连接 Binance Smart Chain通过交易对绘制 k 线 安装 web3 pip install web3 连接到 Binance Smart Chain 使用公共的 BSC 节点 URL。 from web3 import Web3# 连接到 BSC 公共节点bsc_url = "https://bsc-dataseed.binance.org/"web3 = Web3

PAT甲级 1085 Perfect Sequence 二分和双指针(Two Pointers)

二分写法 #include <bits/stdc++.h>using namespace std;int find_upper_bound(const vector<long long>& nums, long long x){int beg = 0, end = nums.size(), mid = beg + (end - beg) / 2;while (beg < end) {mid

方法论:SWOT、SMART

解决方案分析方法论SWOT 什么是SWOT:例子中间件RabbitMQ和RocketMQ队列选择对比S(strengths)优势:RabbitMQ团队多人用过,AMQP跨语言、模型API丰富W(weaknesses)劣势:RabbitMQ阅读过源码的人过少,Erlang开发,二次修改不容易O(opportunities)机会:多个容器平台拥抱RabbitMQ,易用性、扩展性强T(threats)

smart-sso单点登录(三):接入指南

目录 前言1.引入客户端依赖2.应用配置修改3.验证 前言 如果您的SpringBoot应用需要接入到smart-sso,只需要简单的两步即可完成。 1.引入客户端依赖 在您任意的SpringBoot应用中maven的pom.xml配置中增加客户端依赖。 <dependency><groupId>com.smart</groupId><artifactId>smart-s

Smart Home DIY 计划

工作了这么长时间了,感觉自己目前的工作内容很不利于技术水平的提升,对此状况,我心里深感不踏实。因此,我决定利用下班时间,边学习边做,做一套真正可用的智能家居系统,首先部署到自己居住的房间。 对此智能家居系统,我的大致构想如下: 1,采集房间的温度、湿度、光照强度、煤气浓度等数据,并将采集的数据通过智能家居网关传送到自建的web服务器,以供 自己通过外网实时查看数据; 2,可通

施耐德ATV610变频器MODBUS通信(SMART PLC)

MODBUS通信相关内容可以参考专栏的系列文章,常用链接如下: 1、提升MODBUS-RTU通信数据刷新速度 提升MODBUS-RTU通信数据刷新速度的常用方法_modbus rtu通讯慢-CSDN博客文章浏览阅读1k次。SMART PLC的MODBUS-RTU通信请参考下面文章链接:【精选】PLC MODBUS通信优化、提高通信效率避免权限冲突(程序+算法描述)-CSDN博客MODBUS通讯

smart_rtmpd 的后台管理

高效的流媒体服务器 smart_rtmpd,您值得拥有 smart_rtmpd 的下载地址 https://github.com/superconvert/smart_rtmpd smart_rtmpd 的管理后台 https://github.com/superconvert/smart_rtmpd/edit/master/web%20manager/src/README.md