C++面试八股文:什么是RAII? 焦点速递
2023-06-14 05:35:55 博客园

某日二师兄参加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++面试生涯。

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

热门推荐

文章排行

  1. 2023-06-14C++面试八股文:什么是RAII? 焦点速递
  2. 2023-06-14当前热门:赵丽颖的下家有多难?年纪大了,又嫁了二胎,
  3. 2023-06-13安徽茂丰塑业有限公司
  4. 2023-06-13热点在线丨上海工程类中级职称_上海工程师中级职称评定要怎么做
  5. 2023-06-13当前播报:铜矿采选概念相关股票有哪些?(2023/6/13)
  6. 2023-06-13老人掉进长江,武汉轮渡船员合力救人
  7. 2023-06-13当前速递!印度发出正式通知冻结48亿元资金 小米:在全球范围内坚持合法合规经营
  8. 2023-06-13力的计算公式f=ma_力的计算公式 世界动态
  9. 2023-06-13周鸿祎:国内大模型已基本赶上国际先进水平,收回之前说的话
  10. 2023-06-13世界今日报丨油价小幅下调 加一箱油将少花2元
  11. 2023-06-13头条:沙特航空连通计划CEO:加强与中国航空连通性是沙特旅游的重要机遇
  12. 2023-06-13洛凯股份06月13日涨停分析
  13. 2023-06-13恭喜陈梦,恭喜孙颖莎,国乒2大金花官宣入职,王曼昱遗憾无缘_环球今头条
  14. 2023-06-13环球精选!长春市宽城经济开发区(兰家镇)组织开展交通安全宣教活动
  15. 2023-06-13重庆老旧小区改造6项政策机制获全国推广 要闻速递
  16. 2023-06-13板拉筋梅花形布置计算_板拉筋_焦点速看
  17. 2023-06-13新研究指出太阳风来自于冕洞
  18. 2023-06-13加拿大批准来自枯草芽孢杆菌ROM的α-淀粉酶用于面包等食品中|当前消息
  19. 2023-06-13每日精选:广东药监:夏季选用防晒霜有门道
  20. 2023-06-133人获刑!江西成功侦破一起特大跨省案