首页 > 编程语言 >C++面试八股文:什么是RAII?

C++面试八股文:什么是RAII?

时间:2023-06-13 23:32:45浏览次数:44  
标签:std mtx 八股文 RAII 面试官 C++ guard mutex lock

某日二师兄参加XXX科技公司的C++工程师开发岗位第13面:

面试官:什么是RAII

二师兄:RAIIResource Acquisition Is Initialization的缩写。翻译成中文是资源获取即初始化。

面试官:RAII有什么特点和优势?

二师兄:主要的特点是,在对象初始化时获取资源,在对象析构时释放资源。这种技术可以避免资源邪路或内存泄漏,提高程序的健壮性和可维护性。

面试官:使用RAII可以做哪些事情?

二师兄:主要可以管理动态分配的内存而不需要手动申请和释放,管理锁不需要手动加锁和解锁,管理句柄不需要手动打开和关闭。

面试官:你知道有哪些C++标准库中已经存在的类型使用了RAII技术?

二师兄:有std::shared_ptrstd::unqiue_ptrstd::lock_guardstd::unqiue_lock

面试官:知道std::lock_guard如何实现的吗?

二师兄:应该是在构造的时候锁定,在析构的时候解锁。

class lock_gurad
{
public:
    lock_gurad(std::mutex& mtx):mtx_(mtx){mtx_.lock(); }
    ~lock_gurad(){mtx_.unlock();}
private:
    std::mutex mtx_;
};

面试官:好的。今天的面试到此结束,回去等通知吧。

让我们仔细看一下二师兄的这段代码,不难发现存在以下问题:

  1. std::mutex mtx_不能直接保存值,因为mutex没有拷贝构造函数,所以这里需要使用引用。
  2. 需要在构造函数前加上explicit关键字,防止编译器隐式转换
  3. lock_gurad不能拷贝(因为会有多个实例管理一个互斥锁,导致不可预测的行为),所以要删除拷贝构造函数和拷贝赋值运算符。

修复后的代码如下:

class lock_guard
{
public:
    explicit lock_guard(std::mutex& mtx) : mtx_(mtx){ mtx_.lock(); }
    ~lock_guard(){ mtx_.unlock(); }
    lock_guard(const lock_guard&) = delete;
    lock_guard& operator=(const lock_guard&) = delete;
private:
    std::mutex&  mtx_;
};

好了,今日份面试到这里就结束了。 关注我,带你走进二师兄的C++面试生涯。

关注我,带你21天“精通”C++!(狗头)

标签:std,mtx,八股文,RAII,面试官,C++,guard,mutex,lock
From: https://blog.51cto.com/binarch/6474527

相关文章

  • 《C++》类和对象
    C++面向对象的三大特性:封装、继承、多态封装将属性和行为作为一个整体,表现生活中的事物。对属性和行为加以权限控制。classCompute{ //访问权限public: intAdd(intx,inty) { returnx+y; } intSub(intx,inty) { returnx+y; } intMul(intx,inty) {......
  • 现代C++学习指南-方向篇
    C++是一门有着四十年历史的语言,先后经历过四次版本大升级(诞生、98、11、17(20),14算小升级)。每次升级都是很多问题和解决方案的取舍。了解这些历史,能更好地帮助我们理清语言的发展脉络。所以接下来我将借它的发展历程,谈一谈我对它的理解,最后给出我认为比较合理的学习路线指南。C++0......
  • 论c++实现sql连接
    寻找关于c++对sql连接的过程非常艰辛。今天要做一个简单项目,要求在远程sql上实现对数据的实时模拟,每五分钟进行一次随机产生数据并写入。在此之前我并没有用过代码实现sql连接的经历,在翻阅无数资料后,终于实现了使用visualstudio对mysql的连接。第一步,添加mysql的依赖文件,在v......
  • 《C++》函数重载
    函数默认值函数调用时传入数据则覆盖默认值,反则使用默认值intAdd(inta,intb=0,intc=0){ returna+b+c;}intmain(){ intret=Add(1,3); cout<<ret<<endl; system("pause"); return0;}如果从一个位置设置默认参数,其后也必须设置默认参数若函数声明有默认......
  • 现代C++学习指南-类型系统
    在前一篇,我们提供了一个方向性的指南,但是学什么,怎么学却没有详细展开。本篇将在前文的基础上,着重介绍下怎样学习C++的类型系统。写在前面在进入类型系统之前,我们应该先达成一项共识——尽可能使用C++的现代语法。众所周知,出于兼容性的考虑,C++中很多语法都是合法的。但是随着新......
  • Python调用C/C++动态库
    一、编译C++代码并封装成动态库1、创建编译dll文件的项目,在上面的官网介绍的更详细,这里就不多做介绍了。注意在vs之中新建一个项目,项目选择动态链接库(DLL)2、2.在源文件中添加cpp文件并写好函数#include<iostream>#defineMATHLIBRARY_APIextern"C"__declspec(dllexport)......
  • C++之继承(万字长文详解)
    继承继承的概念继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承......
  • C++销售管理助手[2023-06-13]
    C++销售管理助手[2023-06-13]用c++线性结构写一个完整程序,题目如下小美学完线性表后,想设计一个小程序,管理自己的网店销售情况,她想实现以下功能,请设计程序帮她实现:(1)可以录入商品信息,格式如下:(商品编号、商品名称、数量、进价、标价、折扣、售价)样例:(c0001,海飞丝,40,20,30......
  • C++ Builder 初学问与答(二)
     2.文本输入组件11)问:如果要实现文本输入,在C++Builder中应该怎么办? 答:C++Builder常用文本输入组件来实现,常用的文本输入组件有Edit、MaskEdit、Memo和RichEdit。他们的主要不同在于Edit和MaskEdit用于输入单行文本,而Memo和RichEdit可以输入多行文本。此外Label组件也可用来进行......
  • C++ Builder 初学问与答(一)
    一直以来都想写一点为BCB初学者快速入门的东西,前不久写了几篇《闲谈BCB》想把自己学习BCB中如何来解决难点的方法说给大家,没想到被骂得不成样子。本想不写了,但觉得这些东西留下来能做什么呢?还是用另一种方法来重新演译我的思维吧,最近有些忙,那几篇没有写完的文章,我也会尽快写完的,至......