C++面试题(四)——智能指针的原理和实现

2023-10-31

C++面试题(四)——智能指针的原理和实现

tanglu2004

C++面试题(一)、(二)和(三)都搞定的话,恭喜你来到这里,这基本就是c++面试题的最后一波了。

     1,你知道智能指针吗?智能指针的原理。
     2,常用的智能指针。
     3,智能指针的实现。

  1答案:智能指针是一个类,这个类的构造函数中传入一个普通指针,析构函数中释放传入的指针。智能指针的类都是栈上的对象,所以当函数(或程序)结束时会自动被释放,

     2, 最常用的智能指针: 

              1)std::auto_ptr,有很多问题。 不支持复制(拷贝构造函数)和赋值(operator =),但复制或赋值的时候不会提示出错。因为不能被复制,所以不能被放入容器中。

              2) C++11引入的unique_ptr, 也不支持复制和赋值,但比auto_ptr好,直接赋值会编译出错。实在想赋值的话,需要使用:std::move。

               例如:

                    std::unique_ptr<int> p1(new int(5));
                    std::unique_ptr<int> p2 = p1; // 编译会出错
                    std::unique_ptr<int> p3 = std::move(p1); // 转移所有权, 现在那块内存归p3所有, p1成为无效的指针.

              3) C++11或boost的shared_ptr,基于引用计数的智能指针。可随意赋值,直到内存的引用计数为0的时候这个内存会被释放。

              4)C++11或boost的weak_ptr,弱引用。 引用计数有一个问题就是互相引用形成环,这样两个指针指向的内存都无法释放。需要手动打破循环引用或使用weak_ptr。顾名思义,weak_ptr是一个弱引用,只引用,不计数。如果一块内存被shared_ptr和weak_ptr同时引用,当所有shared_ptr析构了之后,不管还有没有weak_ptr引用该内存,内存也会被释放。所以weak_ptr不保证它指向的内存一定是有效的,在使用之前需要检查weak_ptr是否为空指针。

     3, 智能指针的实现

      下面是一个基于引用计数的智能指针的实现,需要实现构造,析构,拷贝构造,=操作符重载,重载*-和>操作符。

template <typename T>
class SmartPointer {
public:
	//构造函数
	SmartPointer(T* p=0): _ptr(p), _reference_count(new size_t){
		if(p)
			*_reference_count = 1; 
		else
			*_reference_count = 0; 
	}
	//拷贝构造函数
	SmartPointer(const SmartPointer& src) {
		if(this!=&src) {
			_ptr = src._ptr;
			_reference_count = src._reference_count;
			(*_reference_count)++;
		}
	}
	//重载赋值操作符
	SmartPointer& operator=(const SmartPointer& src) {
		if(_ptr==src._ptr) {
			return *this;
		}
		releaseCount();
		_ptr = src._ptr;
		_reference_count = src._reference_count;
		(*_reference_count)++;
		return *this;
	}

	//重载操作符
	T& operator*() {
		if(_ptr) {
			return *_ptr;
		}
		//throw exception
	}
	//重载操作符
	T* operator->() {
		if(_ptr) {
			return _ptr;
		}
		//throw exception
	}
	//析构函数
	~SmartPointer() {
		if (--(*_reference_count) == 0) {
            delete _ptr;
            delete _reference_count;
        }
	}
private:
	T *_ptr;
        size_t *_reference_count;
        void releaseCount() {
		if(_ptr) {
			(*_reference_count)--;
    			if((*_reference_count)==0) {
    				delete _ptr;
    				delete _reference_count;
    			}
		}
    	}
};

int main() 
{
    SmartPointer<char> cp1(new char('a'));
    SmartPointer<char> cp2(cp1);
    SmartPointer<char> cp3;
    cp3 = cp2;
    cp3 = cp1;
    cp3 = cp3;
    SmartPointer<char> cp4(new char('b'));
    cp3 = cp4;
}

      

   

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++面试题(四)——智能指针的原理和实现 的相关文章

  • Boost 错误代码参考

    有谁知道在哪里可以找到升压错误代码的参考 特别是 异步套接字处理程序返回的错误代码 Google 和 grep 头文件已调为空 我从 Linux 上的 asio error hpp 中提取了错误值 顺便说一句 我仅使用标头 asio 而不是
  • 如何防止函数中的隐式转换?

    我正在编写一个实用程序类 其中包含 IsEquals 和 IsGreaterThanEquals 等接受 double 类型参数的方法 当我将浮点值发送到方法时 它们会隐式转换为双精度值并进行比较 我不希望这种事发生 当我发送 float
  • 如何防止 Parallel.ForEach 循环在运行时更改任务数量?

    我正在使用Parallel ForEach循环做一些工作 我用localInit像这样 localInit gt new foo new Foo bars CreateBars 根据文档 https learn microsoft com
  • 委托 System.Action 不接受 1 个参数

    那个行动 readonly Action execute public RelayCommand Action execute this execute null public RelayCommand Action execute Fun
  • 使用 C 序列化 double 和 float

    如何在 C 中序列化双精度数和浮点数 我有以下用于序列化短整型 整数和字符的代码 unsigned char serialize char unsigned char buffer char value buffer 0 value ret
  • 改装和授权标头

    目前 我正在向我的请求添加授权标头 如下所示 文件 SomeFile cs public interface ITestApi Get api test id Task
  • 从 pdf 和 word 文件中提取文本

    如何在 C 中从 pdf 或 word 文件中提取文本 删除粗体 图像和其他富文本格式媒体 您可以使用专为索引服务设计 由索引服务使用的过滤器 它们旨在从各种文档中提取纯文本 这对于在文档内部进行搜索非常有用 您可以将其用于 Office
  • 预期在模拟中调用一次,但使用 Moq 时调用次数为 0 次

    我收到错误 在mock上调用一次 但是0次 下面是我的代码结构 public class GenerateAddress IGenerateAddress public GenerateAddress IAddress createAdd
  • 如何使用 CMake 链接多个库

    我有一些与 DCMTK 相关的代码 如果我从命令行使用 g 我可以成功构建并运行它 这是代码 include dcmtk config osconfig h include dcmtk dcmdata dctk h int main Dcm
  • 值类型数组如何存储在 .NET 对象堆中?

    在 NET中 诸如int之类的值类型对象存储在内存中 引用类型对象需要为引用和对象单独分配内存 并且对象存储在 NET对象堆中 而Array是在堆中创建的 那么int 等值类型的数组如何存储在堆中呢 这是否意味着值类型对象可以存储在堆中而无
  • 即使在不活动状态下,Hangfire 也会继续运行 SQL 查询

    我正在开发一个 ASP net MVC 5 网站 并使用 Hangfire 来安排一些任务 在本例中每 3 分钟一次 我知道一个事实是 运行这样的任务 以及与之相关的数据库查询 只需要几秒钟 我面临的问题是 Hangfire 似乎让我的 S
  • 为什么未命名的命名空间不等同于带有“using命名空间”声明的常规命名空间?

    A 最近的话题 https stackoverflow com questions 3673353 anonymous namespace ambiguityon SO 触发了这个 未命名的命名空间被认为等同于 namespace uniq
  • 静态成员函数中的封闭类的 C++ 类型

    我认为这是完全不可能的 但如果呢 在任何版本的 C 中 是否有可能以某种方式获取静态成员函数中封闭类的类型 class Impossible public static void Fun typedef Impossible Enclosi
  • 访问控制器类中的 appsettings.json 值

    无法弄清楚如何读取startup cs之外的appsettings json值 例如 我想做的是在 Layout cshtml 中 从配置中添加站点名称 例如 ViewData SiteName Configuration GetValue
  • Cmake:在自定义目录中查找 protobuf 包

    我有 cmake 3 10 x 并下载了当前的 protobuf 源 3 6 1 使用 cmake 我创建了 bin 目录 PROTOBUF SOURCE DIR bin 在其中成功构建了该库 下一步我想在我的基于 cmake 的项目中使用
  • 我如何在 WPF 中模仿这种行为?

    我对 WPF 和 C 开发相当陌生 我正在制作这个应用程序 我不知道是否有人熟悉 VOIP App Discord 但他们有一个我非常喜欢的特定行为 并且想尝试使用 WPF 创建类似的风格 当您在 Discord 上添加服务器时 单击一个按
  • 如何在迭代时从地图中删除?

    迭代时如何从地图中删除 喜欢 std map
  • SQlite 查询 - 如何检索多列数据?

    我很难在网上找到一个关于使用 xcode 和 cocos2dx 从 SQlite DB 获取多个值的工作示例 这是我的sql查询 char sql query 100 sprintf sql query SELECT FROM SQList
  • Windows 安装程序 (C#) 错误代码 2869

    我在 VS 2005 中有一个项目 其中有一个控制台应用程序和一个与安装该应用程序关联的安装项目 我在控制台应用程序中还有一个安装程序类 安装项目将使用它在安装前进行一些验证 这些任务正在检查数据库连接字符串并检查某些目录位置以确保它们在安
  • 如何用纯色填充位图?

    我需要使用唯一的 RGB 颜色创建 24 位位图 分辨率 100x100 像素 并将生成的图像保存到磁盘 我目前使用的是SetPixel http msdn microsoft com en us library 6c7eyzyb aspx

随机推荐

  • 看完百度文心一言的魔性作图,我头都笑掉了...

    近日看到网友们用百度文心一言来作图 看了后我都愣住了 1 AI 作画 车水马龙 2 AI 作画 驴肉火烧 3 AI 作画 唐伯虎点秋香 4 AI 作画 鱼香肉丝 5 AI 作画 胸有成竹 6 AI 作画 夫妻肺片 7 AI 作画 红烧狮子头
  • 【GUI】Python图形界面(一)

    Python图形界面 一 第一个界面 1 了解模块代码的组成 导入库 PySimpleGUI 定义布局 确定行数 创建窗口 事件循环 关闭窗口 1 导入库 import PySimpleGUI as sg 2 定义布局 确定行数 layou
  • SharePreference原理

    SharedPreferences是Android提供的数据持久化的一种手段 适合单进程 小批量的数据存储与访问 因为SharedPreferences的实现是基于单个xml文件实现的 并且 所有持久化数据都是一次性加载到内存 如果数据过大
  • Error Handling with C++ Exceptions, Part 1

    by Chuck Allison Error Handling Alternatives With the traditional programming languages of yore a developer s alternativ
  • 电流电压曲线 vc源码_如何真正理解三极管伏安特性曲线在饱和区的含义

    初次学习三极管工作原理的时候 往往会对三极管的伏安特性曲线非常困惑 特别是饱和区的性质 本文就讨论这方面的内容 三极管的工作电路如图所示 图一 三极管工作电路 按照上述电路得出三极管的伏安特性如图所示 教科书中一般都这样描述三极管的三个工作
  • 快排算法实现

    找到分区点 把数组元素放到分区点两侧 再对分区点两侧数组进行排序 完成快排 同样递归实现快排 递归公式 递归终止条件 当所分区只有一个元素是 即元素下标相同时 递归终止 并返回 快排实现目的 对数组进行排序 实现过程 传递一个数组和数组起始
  • wangEditor富文本编辑器图片/视频上传

    wangEditor 有丰富的 API 和足够的扩展性 允许我们自定义开发菜单 模块 插件等 在Vue React中运用也很方便 因此本文介绍下vue中富文本上传图片和视频 安装引入后富文本有显示上传图片按钮 点击上传后会报没有配置上传地址
  • 14. TypeScript 自定义类型

    TypeScript 自定义类型 1 Diff实现 求两个对象不同的部分 let person1 name 123 age 11 address 456 let person2 address 123 type Diff
  • 基于Python+Pytest+Selenium的自动化测试之PO模式简介

    在实际的软件研发过程中 往往会存在项目时间紧张 待测工作量大 待测的功能点较多 但是团队测试人员有限 难以全部测试覆盖的问题 针对问题 我们可以通过自动化测试去解决一些测试工作中遇到的实际问题 把一些工作写成代码 交给机器去处理和执行 解放
  • java中常见的异常及处理方法

    1 java lang nullpointerexception 这个异常大家肯定都经常遇到 异常的解释是 程序遇上了空指针 简单地说就是调用了未经初始化的对象或者是不存在的对象 这个错误经常出现在创建图片 调用数组这些操作中 比如图片未经
  • Ajax基本案例详解之load的实现

    Ajax的load实现 看这篇之前建议大家去看看前面两篇文章 1 Ajax基本案例详解之 ajax的实现 2 Ajax基本案例详解之 get的实现 现在写一下 load 里面的主要内容 semail load doindex jsp ema
  • git恢复修改的文件

    文件修改后想反悔 三种情况 1 未进行任何操作 仅仅修改了文件 2 执行了git add将文件推到了暂存区 3 执行了git commit将文件推到了本地仓库 处理方法 针对情况1 只需要执行git checkout 文件名 情况2 首先g
  • linux常用命令汇总

    内存 cpu查看 free h 以合适内存单位显示内存情况 free s 数字 每几秒刷新内存显示 top 按e切换显示单位 防火墙 centos7 查看防火墙状态 firewall cmd state 停止firewall systemc
  • 服务器无法加载海康sdk依赖的问题

    首先遇到的jna jar和examples jar无法加载的问题 尝试了很多方法无效 以下方法实测有效 其次是动态链接库无法加载的问题 而且是播放库 我的方法比较简单 netsdk加载出来就行了 播放库用不到 删掉引用就行了 最后 我尝试了
  • Android程序员必备!Android学习笔记在互联网上火了,成功定级腾讯T3-2

    前言 2020年是转折的一年 上半年疫情原因 很多学android开发的小伙伴失业了 虽找到了一份工作 但高不成低不就 下半年金九银十有想法更换一份工作 很多需要大厂面试经验和大厂面试真题的小伙伴 想提前准备刷下题 接下来分享一份我的字节跳
  • 财务风险管理的内容

    财务风险管理的内容 一 筹资风险管理 筹资风险来源于两个方面 一是偿债风险 由于借入资金严格规定了借款方式 还款期限和还款金额 如果企业负债较多 而经营管理和现金管理不善 可能导致企业不能按期还本付息 就会产生偿债风险 偿债风险如不能通过财
  • nginx:accept() failed (24: Too many open files)解决方法

    有一台服务器访问量非常高 使用的是nginx 错误日志不停报以下错误 2010 05 26 08 53 49 alert 13576 0 accept failed 24 Too many open files 2010 05 26 08
  • 【R语言】期末大作业

    头部 title LZW HR dashboard report output flexdashboard flex dashboard orientation columns vertical layout fill source cod
  • Ant Design Cascader 交互场景

    何时使用 需要从一组相关联的数据集合进行选择 例如省市区 公司层级 事物分类等 从一个较大的数据集合中进行选择时 用多级分类进行分隔 方便选择 比起 Select 组件 可以在同一个浮层中完成选择 有较好的体验 业务场景 提交选择器子选项
  • C++面试题(四)——智能指针的原理和实现

    C 面试题 四 智能指针的原理和实现 tanglu2004 http blog csdn net worldwindjp C 面试题 一 二 和 三 都搞定的话 恭喜你来到这里 这基本就是c 面试题的最后一波了 1 你知道智能指针吗 智能指