面试3--智能指针

2023-11-12

面试题目3:

  1. 智能指针有哪些 ?share 和unique有什么区别?如何实现一个unique?
    概念:智能指针是一个类,这个类的构造函数中传入一个普通指针,析构函数中释放传入的指针。智能指针的类都是栈上的对象,所以当函数(或程序)结束时会自动被释放.即将基本类型指针封装为类对象指针(这个类肯定是个模板,以适应不同基本类型的需求),并在析构函数里编写delete语句删除指针指向的内存空间。
    目的:避免资源泄露。

      常见的几种:auto_ptr,shared_ptr,unique_ptr,weak_ptr,
    

auto_ptr:
摒弃auto_ptr的原因,一句话总结就是:避免潜在的内存崩溃问题
auto_ptr films[5] =
{
auto_ptr (new string(“Fowl Balls”)),
auto_ptr (new string(“Duck Walks”)),
auto_ptr (new string(“Chicken Runs”)),
auto_ptr (new string(“Turkey Errors”)),
auto_ptr (new string(“Goose Eggs”))
};
auto_ptr pwin;
pwin = films[2]; // films[2] loses ownership. 将所有权从films[2]转让给pwin,此时films[2]不再引用该字符串从而变成空指针

cout << “The nominees for best avian baseballl film are\n”;
for(int i = 0; i < 5; ++i)
cout << *films[i] << endl;
cout << "The winner is " << *pwin << endl;

unique_ptr:
 unique_ptr实现了独占式拥有概念,意味着它可确保一个对象和其相应资源同一时间只被一个指针拥有。一旦拥有者被销毁或变成空,或开始拥有另一个对象,先前拥有的那个对象就会被销毁,其任何相应资源也会被释放。
{
std::unique_ptr uptr(new int(10)); //绑定动态对象
//std::unique_ptr uptr2 = uptr; //不能賦值
//std::unique_ptr uptr2(uptr); //不能拷貝
std::unique_ptr uptr2 = std::move(uptr); //轉換所有權
uptr2.release(); //释放所有权
}
//超過uptr的作用域,內存釋放

shared_ptr:
shared_ptr则允许多个指针指向同一个对象,实现基于引用计数技术。
智能指针管理的着一个对象,并记录着所有管理同个对象的指针个数,这个个数称为计数。藉由智能指针去初始化或赋值其他智能指针时,计数的值增加1,表示资源对象多了一个引用;当智能指针的生命周期结束或者指向别的对象时,计数的值减去1,表示资源对象减少一个引用。智能指针生命周期结束时,编译器会调用它的析构函数,在析构函数中判断引用计数的值是否为0,若为0,则释放所管理的对象资源;若不为0,表明还有其他指针指向所管理的对象,不释放该对象资源。

int *p = new int(30);
std::shared_ptr bptr§;//方式1
std::shared_ptr aptr = std::make_shared(20);//方式
std::shared_ptr cptr(aptr);
std::cout << “aptr.use_count() = " << aptr.use_count() <<” value = "<<*aptr<<std::endl;//use_count 是引用计数器
std::cout << “bptr.use_count() = " << bptr.use_count() <<” value = "<<*bptr<<std::endl;
std::cout << “cptr.use_count() = " << cptr.use_count() <<” value = "<<*cptr<<std::endl;
//输出是:2,20
// 1,30
// 2,20

如何选择:
(1)如果程序要使用多个指向同一个对象的指针,应选择shared_ptr。这样的情况包括:
有一个指针数组,并使用一些辅助指针来标示特定的元素,如最大的元素和最小的元素;
两个对象包含都指向第三个对象的指针;
STL容器包含指针。很多STL算法都支持复制和赋值操作,这些操作可用于shared_ptr,但不能用于unique_ptr(编译器发出warning)和auto_ptr(行为不确定)。如果你的编译器没有提供shared_ptr,可使用Boost库提供的shared_ptr。
(2)如果程序不需要多个指向同一个对象的指针,则可使用unique_ptr。如果函数使用new分配内存,并返还指向该内存的指针,将其返回类型声明为unique_ptr是不错的选择。这样,所有权转让给接受返回值的unique_ptr,而该智能指针将负责调用delete。可将unique_ptr存储到STL容器在那个,只要不调用将一个unique_ptr复制或赋给另一个算法(如sort())。例如,可在程序中使用类似于下面的代码段。

如何实现shared_ptr:
template<class T,class Del>
class SharePtr
{
public:
SharePtr(T* ptr) //构造函数
: _ptr(ptr), _ref(new int(1))
{
cout << “SharePtr(T* ptr)” << endl;
}
SharePtr( SharePtr& sp) //拷贝构造函数
{
cout <<“SharePtr( SharePtr& sp)” << endl;
_ptr = sp._ptr;
_ref = sp._ref;
(_ref)++;
}
~SharePtr() //析构函数
{
Release();
}
void Release()
{
if (–(
_ref) == 0)
{
delete _ref;
_del(_ptr);
}
}
T* operator->() //箭头操作符的重载
{
return _ptr;
}
T& operator*() //解引用操作符重载
{
return _ptr;
}
SharePtr& operator=(SharePtr& sp) //赋值操作符的重载
{
if (_ptr != sp._ptr)
{
Release();
_ptr = sp._ptr;
_ref = sp._ref;
(
_ref)++;
}
return this;
}
private:
T
_ptr;
int* _ref;
Del _del; //-----这是一个对象函数决定着析构时以什么方式释放申请的空间
};

  1. vector 什么时候会失效?list会失效?
  2. 虚函数和纯虚函数区别?
  3. 单例模式怎么实现?设计模式
  4. 多线程开发需要注意哪些?
    7.进程间的通信方式,及特点
    8.C++新特性,lanmda表达式,
    9.vector的push_back 可以用什么替代?
    10.生产和消费模型
    11.内存里空间分配
    12.static作用
    13.继承中如何判断类型是子类还是父类
    14.程序挂了如何调试
    15.栈和队列相互实现
  5. 二叉树
  6. 规范的编程
    18.深复制和浅复制
    19.fork
    20.strcmp,strcpy,memmove实现
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

面试3--智能指针 的相关文章

随机推荐

  • 神经网络——非线性激活

    torch官网 torch nn PyTorch 1 11 0 documentation 非线性变换的主要目的就是给网中加入一些非线性特征 非线性越多才能训练出符合各种特征的模型 常见的非线性激活 ReLU 官网给出的例子 gt gt g
  • C语言求平均成绩小程序(以五个学科为例)

    include
  • 客户好评“收割机”,NPS高达0.7, 实在RPA6.8.0重磅升级解析

    近期 实在智能大模型新品 TARS RPA Agent 发布会召开 通过底层软件架构的全新优化和全面结合大语言模型实现 超进化 持续以AI技术为RPA行业提供领先的超自动化解决方案 同时在发布会上亮相的 还有备受关注的最新版RPA产品 实在
  • buuctf MD5

    打开是一串MD5密文 md5加密后是32位的字符 也有16位的 是去除32位的前后各八位所得 由字母和数字组成 字母要么全是大写要么全是小写 MD5加密是不可逆的加密 无法解密 但是可以爆破出来 给大家推荐一个可以爆破MD5加密的网站htt
  • 小码哥学习感想第一天

    开班须知 本小节知识点 了解 课堂纪律要求 了解 上课的时间和内容安排 了解 学习方法 了解 教学思想和目标 1 课堂纪律要求 手机静音 保持安静 很容易错过精彩 关键瞬间 低调听课 尊重他人 多点反馈 多点互动 积极思考 积极回答 大家一
  • pycharm内无法激活conda虚拟环境

    仅供参考 问题描述 在pycharm终端里conda activate xxx 没报错 但是并没有激活指定的xxx虚拟环境 解决方法 检查是否已将conda加入到系统环境变量内 查找了其他教程 说conda没有加入到环境变量内 但我的已经加
  • 签好软件定制开发合同,需要注意什么

    签订好一份责权分明 细节清晰的软件定制开发合同 对于任何软件定制开发合同的双方而言都是百利无害的 尤其对于软件开发软件定制开发合同这种非常容易引起争议的项目 签订合同的时候更是要慎之又慎 前期做好充足的准备 后期才能达到一个良好的效果 那么
  • Fastapi 学习笔记之请求多个参数

    1 混合使用 Path Query 和请求体参数 from fastapi import FastAPI Path from typing import Optional from pydantic import BaseModel app
  • 人工智能-目标识别:古典目标识别、R-CNN、SPP-NET、Fast-R-CNN、Faster-R-CNN、YOLO

    古典目标识别 第一部分 训练集构造 负样本 使用 select search ss 方法对区域进行融合 gt 计算每个候选区域域真实标记区域 GRadeonTruts GT 之间的重合 如果区域A与GT的重合度在20 50 之间 而且A与其
  • Android LCD(四):LCD驱动调试篇

    关键词 android LCD TFTSN75LVDS83B TTL LVDS LCD电压背光电压平台信息 内核 linux2 6 linux3 0系统 android android4 0 平台 samsung exynos 4210 e
  • Error:Execution failed for task ‘:app:mergeDebugResources‘. > Error: java.util.concurrent.ExecutionE

    我的解决办法是 点击Gradle Scripts下的build gradle Module app 添加如下两行 aaptOptions cruncherEnabled falseaaptOptions useNewCruncher fal
  • 计算机导论 复习 第一章 计算机学什么

    一 核心知识点 1 计算系统构成 硬件 系统软件 操作系统 应用程序 软件 2 算法的特征 算法的高级程序实现方法 3 程序设计语言 机器语言 汇编语言 高级语言 4 计算机发展简史 二 选择题 1 冯 诺伊曼体系结构是现代计算机基础 被人
  • 左程云 Java 笔记--前缀树 贪心算法

    文章目录 前缀树 贪心算法 例1 字典序排序 例3 哈夫曼编码 例四 堆的一个应用 N皇后 总结 前缀树 介绍前缀树 何为前缀树 如何生成前缀树 例子 一个字符串类型的数组arr1 另一个字符串类型的数组arr2 arr2中有哪些字符 是a
  • 【Java】使用Swing组件弹窗展示九十九乘法表

    目录 一 效果展示 二 完整代码 三 代码思路 一 效果展示 直接先上效果图 二 完整代码 import java awt import javax swing public class MultiplicationTable extend
  • 从零开始 React 服务器渲染

    一 前言 当我们选择使用 Node React 的技术栈开发 Web 时 React 提供了一种优雅的方式实现服务器渲染 使用 React 实现服务器渲染有以下好处 1 利于 SEO React 服务器渲染的方案使你的页面在一开始就有一个
  • 线段树的学习

    在力扣刷题中遇到一道 我的日程安排表 的题 经过求解和资料的参考利用线段树的方法解决 以下对线段树的知识进行一个简单的总结 线段树的定义 线段树是一种二叉搜索树 与区间树相似 它将一个区间划分成一些单元区间 每个单元区间对应线段树中的一个叶
  • 字符游戏-智能蛇的学习

    目标 实现可以智能化移动 不撞墙 自由追寻果实的贪吃蛇程序 即拥有感知 决策 行动的能力 学习过程 根据index中sin曲线的绘制过程可知我们可以知道可以用while循环反复打印的方式达到刷屏的效果 这样 我们将贪吃蛇移动的每一步都单独打
  • Nginx禁止访问某个目录或某个后缀文件

    1 Nginx禁止访问某个目录或某个后缀文件 1 禁止访问某些后缀文件 如php zip location php zip deny all 2 禁止访问某个目录下的某些后缀文件 location wp content uploads wp
  • 带参数的main函数

    为了说明带参数的main函数 我们首先来学习一下有关命令行的概念 命令行 在操作系统状态下 为执行某个程序而键入的一行字符称为命令行 命令行的一般形式为 命令名 参数1 参数2 参数3 参数n 参数之间以一个或多个空格隔开 例如 C gt
  • 面试3--智能指针

    面试题目3 智能指针有哪些 share 和unique有什么区别 如何实现一个unique 概念 智能指针是一个类 这个类的构造函数中传入一个普通指针 析构函数中释放传入的指针 智能指针的类都是栈上的对象 所以当函数 或程序 结束时会自动被