某日二師兄參加XXX科技公司的C++工程師開發崗位第13面: > 面試官:什麼是`RAII`? > > 二師兄:`RAII`是`Resource Acquisition Is Initialization`的縮寫。翻譯成中文是資源獲取即初始化。 > > 面試官:`RAII`有什麼特點和優勢? > > ...
某日二師兄參加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
如何實現的嗎?二師兄:應該是在構造的時候鎖定,在析構的時候解鎖。
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++!(狗頭)