某日二師兄參加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++!(狗頭)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/555043.html
標籤:C++
上一篇:現代C++學習指南-方向篇
下一篇:返回列表