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

Laila ·
更新时间:2024-05-16
· 548 次阅读

目录

引言

面试官:什么是RAII?

面试官:使用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++

需要 登录 后方可回复, 如果你还没有账号请 注册新账号