某日二師兄參加XXX科技公司的C++工程師開發(fā)崗位第13面:
面試官:什么是
RAII
?二師兄:
RAII
是Resource Acquisition Is Initialization
的縮寫。翻譯成中文是資源獲取即初始化。面試官:
RAII
有什么特點(diǎn)和優(yōu)勢(shì)?二師兄:主要的特點(diǎn)是,在對(duì)象初始化時(shí)獲取資源,在對(duì)象析構(gòu)時(shí)釋放資源。這種技術(shù)可以避免資源邪路或內(nèi)存泄漏,提高程序的健壯性和可維護(hù)性。
面試官:使用
RAII
可以做哪些事情?二師兄:主要可以管理動(dòng)態(tài)分配的內(nèi)存而不需要手動(dòng)申請(qǐng)和釋放,管理鎖不需要手動(dòng)加鎖和解鎖,管理句柄不需要手動(dòng)打開和關(guān)閉。
面試官:你知道有哪些C++標(biāo)準(zhǔn)庫(kù)中已經(jīng)存在的類型使用了
RAII
技術(shù)?二師兄:有
std::shared_ptr
、std::unqiue_ptr
和std::lock_guard
及std::unqiue_lock
。面試官:知道
std::lock_guard
如何實(shí)現(xiàn)的嗎?二師兄:應(yīng)該是在構(gòu)造的時(shí)候鎖定,在析構(gòu)的時(shí)候解鎖。
class lock_gurad
{
public:
lock_gurad(std::mutex& mtx):mtx_(mtx){mtx_.lock(); }
~lock_gurad(){mtx_.unlock();}
private:
std::mutex mtx_;
};
面試官:好的。今天的面試到此結(jié)束,回去等通知吧。
讓我們仔細(xì)看一下二師兄的這段代碼,不難發(fā)現(xiàn)存在以下問(wèn)題:
-
std::mutex mtx_
不能直接保存值,因?yàn)?code>mutex沒(méi)有拷貝構(gòu)造函數(shù),所以這里需要使用引用。 - 需要在構(gòu)造函數(shù)前加上
explicit
關(guān)鍵字,防止編譯器隱式轉(zhuǎn)換 -
lock_gurad
不能拷貝(因?yàn)闀?huì)有多個(gè)實(shí)例管理一個(gè)互斥鎖,導(dǎo)致不可預(yù)測(cè)的行為),所以要?jiǎng)h除拷貝構(gòu)造函數(shù)和拷貝賦值運(yùn)算符。
修復(fù)后的代碼如下:
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_;
};
好了,今日份面試到這里就結(jié)束了。 關(guān)注我,帶你走進(jìn)二師兄的C++面試生涯。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-481435.html
關(guān)注我,帶你21天“精通”C++?。ü奉^)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-481435.html
到了這里,關(guān)于C++面試八股文:什么是RAII?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!