C++面经之什么是RAII面试问题解析

 更新时间:2023年06月14日 08:43:06   作者:二进制架构  
这篇文章主要介绍了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_;
};

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

复盘

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

  • std::mutex mtx_不能直接保存值,因为mutex没有拷贝构造函数,所以这里需要使用引用。
  • 需要在构造函数前加上explicit关键字,防止编译器隐式转换
  • 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++面试的资料请关注脚本之家其它相关文章!

相关文章

  • C++ 实现一个复数类的实例代码

    C++ 实现一个复数类的实例代码

    这篇文章主要介绍了C++ 实现一个复数类的实例代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • 关于C++的重载运算符和重载函数

    关于C++的重载运算符和重载函数

    一般来说,重载运算符在实际的项目开发中会经常的用到,但如果某些自定义类型通过简短几行代码重载一些常用的运算符(如:+-*/),就能让编程工作带来方便,需要的朋友可以参考下本文
    2023-05-05
  • C++ Sqlite3的使用方法

    C++ Sqlite3的使用方法

    这篇文章主要介绍了C++ Sqlite3的使用方法,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-06-06
  • C++中volatile关键字及常见的误解总结

    C++中volatile关键字及常见的误解总结

    这篇文章主要给大家介绍了关于C++中volatile关键字及常见的误解的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-05-05
  • VS2019 Nuget找不到包的问题处理

    VS2019 Nuget找不到包的问题处理

    这篇文章主要介绍了VS2019 Nuget找不到包的问题处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • 用C/C++实现linux下检测网络接口状态

    用C/C++实现linux下检测网络接口状态

    这篇文章主要为大家详细介绍了用c/c++实现linux下检测网络接口状态,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • C++初学者之根据输入的任何一个正整数,输出可能被表示的连续正整数

    C++初学者之根据输入的任何一个正整数,输出可能被表示的连续正整数

    这篇文章主要介绍了C++初学者之根据输入的任何一个正整数,输出可能被表示的连续正整数的相关资料,需要的朋友可以参考下
    2016-03-03
  • C语言数据结构中约瑟夫环问题探究

    C语言数据结构中约瑟夫环问题探究

    这篇文章主要介绍了C语言数据结构中约瑟夫环问题,总的来说这并不是一道难题,那为什么要拿出这道题介绍?拿出这道题真正想要传达的是解题的思路,以及不断优化探寻最优解的过程。希望通过这道题能给你带来一种解题优化的思路
    2023-01-01
  • C++面试八股文之什么是构造函数

    C++面试八股文之什么是构造函数

    构造函数是一种特殊的成员函数,用于创建和初始化类的对象,这篇文章主要为大家详细介绍了C++中构造函数的相关知识点,需要的可以参考一下
    2023-06-06
  • c++中冒号(:)和双冒号(::)的使用说明

    c++中冒号(:)和双冒号(::)的使用说明

    以下是对c++中冒号和双冒号的用法进行了介绍,需要的朋友可以过来参考下
    2013-07-07

最新评论