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

打印 上一主题 下一主题

主题 876|帖子 876|积分 2628

某日二师兄参加XXX科技公司的C++工程师开发岗位第13面:
面试官:什么是RAII?
二师兄:RAII是Resource Acquisition Is Initialization的缩写。翻译成中文是资源获取即初始化。
面试官:RAII有什么特点和优势?
二师兄:主要的特点是,在对象初始化时获取资源,在对象析构时释放资源。这种技术可以避免资源邪路或内存泄漏,提高程序的健壮性和可维护性。
面试官:使用RAII可以做哪些事情?
二师兄:主要可以管理动态分配的内存而不需要手动申请和释放,管理锁不需要手动加锁和解锁,管理句柄不需要手动打开和关闭。
面试官:你知道有哪些C++标准库中已经存在的类型使用了RAII技术?
二师兄:有std::shared_ptr、std::unqiue_ptr和std::lock_guard及std::unqiue_lock。
面试官:知道std::lock_guard如何实现的吗?
二师兄:应该是在构造的时候锁定,在析构的时候解锁。
  1. class lock_gurad
  2. {
  3. public:
  4.     lock_gurad(std::mutex& mtx):mtx_(mtx){mtx_.lock(); }
  5.     ~lock_gurad(){mtx_.unlock();}
  6. private:
  7.     std::mutex mtx_;
  8. };
复制代码
面试官:好的。今天的面试到此结束,回去等通知吧。
让我们仔细看一下二师兄的这段代码,不难发现存在以下问题:

  • std::mutex mtx_不能直接保存值,因为mutex没有拷贝构造函数,所以这里需要使用引用。
  • 需要在构造函数前加上explicit关键字,防止编译器隐式转换
  • lock_gurad不能拷贝(因为会有多个实例管理一个互斥锁,导致不可预测的行为),所以要删除拷贝构造函数和拷贝赋值运算符。
修复后的代码如下:
  1. class lock_guard
  2. {
  3. public:
  4.     explicit lock_guard(std::mutex& mtx) : mtx_(mtx){ mtx_.lock(); }
  5.     ~lock_guard(){ mtx_.unlock(); }
  6.     lock_guard(const lock_guard&) = delete;
  7.     lock_guard& operator=(const lock_guard&) = delete;
  8. private:
  9.     std::mutex&  mtx_;
  10. };
复制代码
好了,今日份面试到这里就结束了。  关注我,带你走进二师兄的C++面试生涯。
关注我,带你21天“精通”C++!(狗头)

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

涛声依旧在

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表