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

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

时间:2023-06-18 22:34:50浏览次数:33  
标签:std mtx 八股文 RAII C++ guard mutex lock

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

某日二师兄参加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_;
};

标签:std,mtx,八股文,RAII,C++,guard,mutex,lock
From: https://www.cnblogs.com/bujidao1128/p/17489891.html

相关文章

  • C++基础知识总结
    2023/6/18本篇章记录学习过程C++的基础概念和代码测试实现,还有很多需要补充。一是还不清楚,二是还没有学到。打算学习过程中后面再做补充。先看完《C++primer》书之后再慢慢来添加补充1.函数重载一个函数名可以实现多个功能,这取决于函数参数不同来实现判断对应的功能,与返回......
  • C++面试八股文:std::string是如何实现的?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第18面:面试官:std::string用过吧?二师兄:当然用过(废话,C++程序员就没有没用过std::string的)。面试官:std::string("hello")+"world"、"hello"+std::string("world")和std::string("hello")+std::string("world")的......
  • C++面试八股文:std::string是如何实现的?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第18面:面试官:std::string用过吧?二师兄:当然用过(废话,C++程序员就没有没用过std::string的)。面试官:std::string("hello")+"world"、"hello"+std::string("world")和std::string("hello")+std::string("world")的......
  • C++构造函数
    RAIIResourceAcquisitionIsInitialization,资源获取即初始化这是一种解决资源管理问题的方法,将资源的有效期与持有资源的对象的生命期严格绑定,由对象的构造函数完成资源的分配,由析构函数完成资源的释放C++借助构造函数和析构函数,解决了传统的malloc&free和new&de......
  • C++创建对象的4种方式对比
    三种方式分别为等号,圆括号,大括号,最后一种是等号和大括号一起使用等号和圆括号是以前就存在的,大括号是新的语法,其具有2个优点:防止变窄转换:大括号不支持变窄转换,等号和圆括号为了向下兼容支持变窄转换免疫C++最令人头疼的解析:C++规定任何可以被解析为一个声明的东西必......
  • Python和C++之间的主要区别点?
    Python和C++之间的区别可以简洁地概括如下:编程范式:Python是一种解释型、面向对象的动态语言,更注重代码的简洁性和可读性,适合快速开发和原型设计。C++是一种编译型、多范式语言,支持面向对象、过程式和泛型编程,更注重底层的控制和性能优化。语法复杂性:C++具有较为复杂的语法和......
  • C++家谱管理系统[2023-06-18]
    C++家谱管理系统[2023-06-18]小组项目二实验题目:家谱管理系统实验目的:1、掌握树以及二叉树的定义;2、掌握树以及二叉树的基本操作,如建立、查找、插入和删除等。实验要求:小组合作方式,共同讨论完成该任务。实验内容:家谱管理系统是查询家谱信息必不可少的一部分,利用家谱管理系......
  • 【详解C++中的引用】
    @TOC一、什么是引用引用就是给一个变量取别名。注意:这个引用不会新开辟一块空间,而是和原来的变量公用一块空间。举个例子:李逵,在家称为"铁牛",江湖上人称"黑旋风"。二、引用规则引用规则:引用实体类型+&+引用别名=引用实体。比如下面:intmain(){ inta=10; //引用 int&ba=a......
  • Licensecc-C++ License Manager
    [email protected] Licensecc:aC++softwarelicensemanager。使用Licensecc可以给开发的软件加上保护,限制软件的使用。通过授权控制来限制软件的使用,也可以限制软件的使用时间,及限制软件在指定机器上运行。Licensecc是基于BSD协议开源的软件授权......
  • C++ STL(algorithm)
    1字符和整数排序#include<iostream>#include<algorithm>usingnamespacestd;voidstl1(){inta[]={-1,9,-34,100,45,2,98,32};intlen=sizeof(a)/sizeof(int);sort(a,a+len);//由小到大排列sort(a,a+len,greater<int>());//由大到小排列}vo......