关于c++:C面试八股文什么是RAII

36次阅读

共计 1026 个字符,预计需要花费 3 分钟才能阅读完成。

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

好了,今日份面试到这里就完结了。关注我,带你走进二师兄的 C ++ 面试生涯。

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

正文完
 0