【八股03.29】

【八股03.29】

1.内存泄漏?野指针?悬挂指针?

什么是内存泄漏?

内存泄漏是指程序运行过程中申请的动态分配的堆内存没有被释放,造成系统内存浪费,运行速度减慢甚至崩溃等严重后果。


如何避免?

养成良好的编码习惯,及时释放动态分配的堆内存。
使用智能指针,让其自动释放。
使用内存泄漏检测工具,如Valgrind等。


什么是野指针?什么是悬挂指针?

野指针是未初始化的指针,指向随机的地址;
悬挂指针是指向已经释放的内存的指针。


double delete是未定义行为
delete nullptr没有影响
delete p后,p变成一个悬挂指针,通常delete后需要将p设为nullptr

2.什么是智能指针?智能指针有哪些?

智能指针是C++11引入的一个类模板,用来帮我们自动管理资源,通常情况下,它内部封装了一个指向动态内存的裸指针,在析构函数它会自动释放此前申请的动态内存,防止我们因为忘记释放或发生异常导致的内存泄漏。
常用的有unique_ptr, shared_ptr, weak_ptr,好像还有个auto_ptr,已经废弃了。

3.说说这几种智能指针

  • unique_ptr是一种独占式的智能指针,某一时刻只能有一个智能指针拥有资源的所有权,它不可以被拷贝,可以通过移动来交出资源的所有权。
  • shared_ptr是一种共享式的智能指针,它允许多个智能指针同时拥有资源的所有权,它内部会维护一个引用计数,当管理资源的智能指针+1时,内部的引用计数就会+1,在析构函数中会将引用计数-1,当引用计数为0时,就会释放资源。当返回this指针的shared_ptr和存在循环引用时,shared_ptr可能会出现一些问题,weak_ptrshared_ptr搭配使用的话就可以解决这些问题。
  • weak_ptr其实并不管理任何资源的生命周期,它也不会使得对应资源的引用计数增加,它一般和shared_ptr一起搭配使用,作为一个旁观者观测shared_ptr中管理的资源是否存在。比如循环引用中,只要将一个类中的shared_ptr改为weak_ptr就可以避免循环引用导致的死锁,因为当一个weak_ptr指向一个资源时,对应shared_ptr的引用计数不会+1。

4.shared_ptr的线程安全问题

shared_ptr的线程安全问题主要包括3点

  • 引用计数的加减操作是否线程安全?
    shared_ptr保证了引用计数的加减是一个原子操作,所以这个是线程安全的。
  • shared_ptr修改指向时是否线程安全?(这个还没理解透,陈硕那本书里有)
    这个要分两种情况讨论。当shared_ptr通过引用和指针传递时,不同的线程操作的是同一个shared_ptr此时是线程不安全的;当shared_ptr通过值传递时,不同的线程操作的不是同一个shared_ptr,不过指向的资源是相同的,此时是线程安全的。
  • 操作shared_ptr指向的数据时是否线程安全?
    这个是由所指向的数据类型决定的,这个线程不安全不是由于shared_ptr导致的,是因为这个数据类型自身就是线程不安全的。

5.有哪些IO模型?

  • 阻塞IO
  • 非阻塞IO
  • IO复用
  • 信号驱动IO
  • 异步IO

6.什么是阻塞IO?什么是非阻塞IO?什么是同步IO?什么是异步IO?

一个典型的IO分为两阶段:数据准备数据读写
比如说一个recv操作,会从网络中接收数据到内核缓冲区,这就是数据准备的过程,然后再从内核缓冲区读到用户空间,这就是数据读写的阶段。

阻塞IO和非阻塞IO主要说的是当数据没有准备好时,发起IO的线程的状态。

  • 阻塞:当数据没准备好时,阻塞等待。
  • 非阻塞:当数据没准备好时,不会阻塞等待,直接返回一个错误,可以通过errno判断出错还是数据没准备好。

同步IO和异步IO主要说的是是由内核还是应用程序来进行读写数据。

  • 同步:由应用程序完成IO操作,在数据读写阶段发起IO操作的线程还是会阻塞,之后才会继续向下执行。
  • 异步:交给操作系统完成IO操作,应用程序调用异步IO后立刻就可以继续往下执行,IO操作完成后会通知应用程序。

在处理IO的时候,阻塞和非阻塞都是同步IO,只有使用了特殊的API才是异步IO。

上述只是讨论了,在IO层面上的的阻塞非阻塞和同步异步,但是跳出IO这个范围,在大的层面上来说,感觉应该基本等于同义词。阻塞与非阻塞主要关注调用者等待调用结果时的一个状态,同步主要说线程必须完成前一个任务才能进行下一个,异步一般用在多线程中,当前线程开启一个任务可以去执行其它任务,可能由其它线程完成后再通知它。

7.说说IO多路复用?为什么要使用IO多路复用?IO多路复用的实现方式?

什么是IO多路复用?

IO多路复用是一种同步IO模型,多路是说多个网络连接,复用是指使用同一个线程,它使得一个线程可以同时监视多个文件描述符,阻塞直到监视的文件描述符处于就绪状态。


为什么需要IO多路复用?

如果不使用IO多路复用的话,假如有10000个网络连接,我们就要需要10000个线程去监视每个文件描述符,如果使用IO多路复用的话,就只需要一个线程来监视所有文件描述符,当有就绪的文件描述符时,再分配线程去进行处理,这样可以大大减少所需要的线程数量,因为线程创建和切换是需要开销了,这样能更加节省系统资源吧。


IO多路复用的实现方式?

IO多路复用主要有3中实现方式:select, poll, epoll.

8.IO多路复用之select

使用select之前要先创建一个fd_set结构,这个实际上就是一个数组,一共1024位,类似位图,每一位代表我们监听的一个文件描述符。当我们需要监听一个文件描述符时,通过select提供的宏函数将对应的位置为1即可,调用select时还需要传入一个参数就是最大文件描述符+1,因为内核是采取线性遍历的方式查看对应文件描述符上是否有事件发生。这个参数可以告诉内核停止遍历了。当有文件描述符就绪时,select就会返回,fd_set中对应的位仍然是1,没有事件发生的文件描述符对应的位会被置为0。select会返回就绪的文件描述符总数,但是我们仍然需要遍历fd_set来确定哪些文件描述符是就绪的。

缺点:

  • select监视的文件描述符数量是有限的,也就是fd_set的位数,这个在内核中是确定了的。
  • 每次调用select都要将fd_set由用户态拷贝到内核态,开销比较大,效率比较低。
  • 内核对fd_set中文件描述符的检测方式是线性扫描,效率比较低。

9.IO多路复用之poll

使用poll的话我们要先对每个要监听的文件描述符创建一个pollfd结构,这个结构体中成员有:被监听的文件描述符fd,感兴趣的事件events,实际发生的事件revents,同时poll还需要一个参数来指定pollfd数组的大小。poll会返回就绪的文件描述符总数,不过我们也需要遍历pollfd数组来确定哪些文件描述符是就绪的。pollselect没有本质区别,它只解决了部分select的问题,监听的文件描述符总数是没有限制的,但仍然有以下缺点。

缺点:

  • 每次调用都要讲pollfd数组由用户态拷贝到内核态,效率比较低。
  • 内核对文件描述符也是采用线性的方式查询,效率比较低。

10.IO多路复用之epoll

epoll有3个API,epoll_cerate创建一个epoll实例,epoll_ctl修改epoll感兴趣的文件描述符,epoll_wait监听文件描述符,阻塞直到有就绪的文件描述符。

epoll是由红黑树和就绪链表实现的,epoll通过红黑树管理文件描述符,不会采用线性方式扫描文件描述符,而是采用回调机制,当文件描述符就绪时,回调函数会将其放到就绪链表中,当就绪链表不为空时,epoll_wait就会返回。同时epoll采用mmap的方式进行内核态和用户态的信息交换,避免了不必要的内存拷贝。epoll_wait会返回已经就绪的文件描述符数量,而且传出参数evs数组中只会有就绪的文件描述符对应的epoll_event,不需要遍历所有文件描述符。

epoll有两种工作模式:LT(水平触发),ET(边沿触发)。
水平触发是epoll默认的工作模式,比如说对于读事件来说,如果是水平触发模式,那么只要读缓冲区还有数据,读事件就会一直被触发,epoll_wait会直接返回;如果是边沿触发模式,那么只有当读缓冲区由空变为非空时,读事件才会触发,也就是说如果数据没有一次读完,读缓冲区还有数据,在边沿触发模式下,读事件是不会触发的,epoll_wait不会返回。所以边沿触发模式一般要循环读,确保将数据一次读完,同时还要将文件描述符设置为非阻塞的,防止读操作无意义的阻塞,非阻塞读在读完数据后后返回errnoEAGAIN,通过这个可以判断数据是否已经读完。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/780163.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DARTS-PT: RETHINKING ARCHITECTURE SELECTION IN DIFFERENTIABLE NAS

Rethinking Architecture Selection in Differentiable NAS 论文链接:https://arxiv.org/abs/2108.04392v1 项目链接:https://github.com/ruocwang/darts-pt ABSTRACT 可微架构搜索(Differentiable Neural Architecture Search, NAS)是目前最流行的网…

光耦合器电路基本概述

在当今快速发展的技术环境中,光耦合器电路在确保电信号跨隔离电路的无缝传输方面发挥着关键作用。这些半导体器件通常被称为光电隔离器,具有许多优点,包括电路隔离、信号传输和精确的电路控制。然而,如果不全面了解市场上各种光耦…

Python批量提取pdf首页并合并为一个文件

前情提要:python安装pypdf2包 pip install pypdf2 第一种:既需要每一个单独的首页,也需要将首页合并。 整体操作思路,将文件夹下面原本的每一个pdf获取第一页,然后再写出,将其放在FirstPage文件夹下。再…

Verilog语法之always语句学习

always语法是Verilog_HDL中最常用的一种语法。 always过程语句和语句块组成的,语法格式如下所示。 always(敏感信号1 or 敏感信号2.....) always实现组合逻辑和时序逻辑。用always实现组合逻辑要将所有的敏感信号加入敏感列表中;用always实现时序逻辑时…

vue 窗口内容滚动到底部

onMounted(() > {scrollToBottom() }) // 滚动到底部方法 const scrollToBottom () > {// 获取聊天窗口容器let chatRoom: any document.querySelector(".chat-content");// 滚动到容器底部chatRoom.scrollTop chatRoom.scrollHeight; } 效果 聊天窗口代码…

aeon,一个好用的 Python 库!

更多Python学习内容:ipengtao.com 大家好,今天为大家分享一个好用的 Python 库 - aeon Github地址:https://github.com/aeon-toolkit/aeon 在现代计算机科学和人工智能领域,处理时间序列数据是一个重要而复杂的任务。Python aeon库…

npm install 报错ERESOLVE unable to resolve dependency tree

描述:npm install 报错ERESOLVE unable to resolve dependency tree 解决方案: npm install --legacy-peer-deps

深入MNN:开源深度学习框架的介绍、安装与编译指南

引言 在人工智能的世界里,深度学习框架的选择对于研究和应用的进展至关重要。MNN,作为一个轻量级、高效率的深度学习框架,近年来受到了众多开发者和研究人员的青睐。它由阿里巴巴集团开源,专为移动端设备设计,支持跨平…

gateway 分发时若两个服务的路由地址一样,怎么指定访问想要的服务下的地址

1.思路 在使用Spring Cloud Gateway时,如果两个服务的路由地址相同,可以通过Predicate(断言)和Filter(过滤器)的组合来实现根据请求的不同条件将请求分发到不同的服务下的地址。 使用Predicate进行路由条件…

sync包常用并发安全数据结构

sync.WaitGroup 使用 sync.WaitGroup用于等待一组goroutine完成。Add方法设置计数器,Done方法减少计数器,Wait方法阻塞直到计数器为0。 package mainimport ("fmt""sync""time" )func worker(id int, wg *sync.WaitGroup…

Hive窗口函数笔试题(面试题)

Hive笔试题实战 短视频 题目一:计算各个视频的平均未完播率 有用户-视频互动表tb_user_video_log: id uid video_id start_time end_time if_follow if_like if_retweet comment_id 1 101 2001 2021-10-01 10:00:00 2021-10-01 10:00:30…

使用mysql官网软件包安装mysql

确定你的操作系统,我的是Centos myqsl 所有安装包的地址:https://repo.mysql.com/yum/ 如果你是使用rpm安装你可以到对应的版本里面找到对应的包。 mysql 发行包的地址:http://repo.mysql.com/ 在这里你可以找到对应的发布包安装。 这里使用y…

TCP/IP 网络模型有哪几层?(计算机网络)

应用层 为用户提供应用功能 传输层 负责为应用层提供网络支持 使用TCP和UDP 当传输层的数据包大小超过 MSS(TCP 最大报文段长度) ,就要将数据包分块,这样即使中途有一个分块丢失或损坏了,只需要重新发送这一个分块…

【2】单链表

【2】单链表 1、单链表2、单链表的设计3、接口设计4、SingleLinkedList5、node(int index) 返回索引位置的节点6、clear()7、添加8、删除9、indexOf(E element) 1、单链表 📕动态数组有个明显的缺点 🖊 可能会造成内存空间的大量浪费 📕 能否…

基于pear-admin-flask 的 flask 使用教程

我最近接触到了一个极为出色的Flask后台库——pear-admin-flask,这个库具有很高的二次开发价值。借此机会学习并吸收其中Flask开发的一些高级技巧。 1. flask 自定义命令 pear-admin-flask/applications/common/script/admin.py from flask.cli import AppGroup …

CUDA从入门到放弃(十四):CUDA Thrust库

CUDA从入门到放弃(十四):CUDA Thrust库 Thrust 是一个基于标准模板库(STL)的 C 模板库,专为 CUDA 设计,旨在简化高性能并行应用的开发。它提供了一系列数据并行原语,如扫描、排序和…

vue基础教程(4)——十分钟吃透vue路由router

同学们可以私信我加入学习群! 正文开始 前言一、路由概念二、路由使用三、创建路由对应的组件四、给整个项目一个入口总结 前言 前面的文章运行成功后,页面显示如下: 在这个页面中,点击Home和About都会切换右面的页面内容&#…

《责任链模式(极简c++)》

本文章属于专栏- 概述 - 《设计模式(极简c版)》-CSDN博客 模式说明 方案: 责任链模式将请求的发送者和接收者解耦,构成一个链条,并由多个对象对请求进行处理,直到找到合适的处理者为止。优点: …

iOS UIFont-真香警告之字体管理类

UIFont 系列传送门 第一弹加载本地字体:iOS UIFont-新增第三方字体 第二弹加载线上字体:iOS UIFont-实现三方字体的下载和使用 第三弹搭建字体管理类:iOS UIFont-真香警告之字体管理类 前言 不知道友们是否有过这种经历,项目已经迭代了很多版本,项目中的文件已经上千个了…

uniapp数组合并函数使用几录

let that { listAll: [1, 2, 3] }; let data [4, 5, 6]; let mergedArray that.listAll.concat(data); console.log(mergedArray); // 输出: [1, 2, 3, 4, 5, 6] console.log(that.listAll); // 输出: [1, 2, 3],原始数组没有改变 唯有美景,可以抚…