C++面經(jīng)之什么是RAII面試問題解析
引言
某日二師兄參加XXX科技公司的C++工程師開發(fā)崗位第13面:
面試官:什么是RAII?
二師兄:RAII
是Resource Acquisition Is Initialization
的縮寫。翻譯成中文是資源獲取即初始化。
面試官:RAII
有什么特點(diǎn)和優(yōu)勢?
二師兄:主要的特點(diǎn)是,在對象初始化時(shí)獲取資源,在對象析構(gòu)時(shí)釋放資源。這種技術(shù)可以避免資源邪路或內(nèi)存泄漏,提高程序的健壯性和可維護(hù)性。
面試官:使用RAII可以做哪些事情?
二師兄:主要可以管理動態(tài)分配的內(nèi)存而不需要手動申請和釋放,管理鎖不需要手動加鎖和解鎖,管理句柄不需要手動打開和關(guān)閉。
面試官:你知道有哪些C++標(biāo)準(zhǔn)庫中已經(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é)束,回去等通知吧。
復(fù)盤
讓我們仔細(xì)看一下二師兄的這段代碼,不難發(fā)現(xiàn)存在以下問題:
std::mutex mtx_
不能直接保存值,因?yàn)?code>mutex沒有拷貝構(gòu)造函數(shù),所以這里需要使用引用。- 需要在構(gòu)造函數(shù)前加上
explicit
關(guān)鍵字,防止編譯器隱式轉(zhuǎn)換 lock_gurad
不能拷貝(因?yàn)闀卸鄠€實(shí)例管理一個互斥鎖,導(dǎo)致不可預(yù)測的行為),所以要刪除拷貝構(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)于C++面試的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java 中ArrayList與LinkedList性能比較
這篇文章主要介紹了java 中ArrayList與LinkedList性能比較的相關(guān)資料,需要的朋友可以參考下2017-03-03C++ 二維數(shù)組參數(shù)傳遞的實(shí)現(xiàn)方法
這篇文章主要介紹了C++ 二維數(shù)組參數(shù)傳遞的實(shí)現(xiàn)方法的相關(guān)資料,這里提供三種方法幫助大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下2017-08-08使用C++實(shí)現(xiàn)單鏈表的操作與實(shí)踐
在程序設(shè)計(jì)中,鏈表是一種常見的數(shù)據(jù)結(jié)構(gòu),特別是在動態(tài)數(shù)據(jù)管理、頻繁插入和刪除元素的場景中,鏈表相比于數(shù)組,具有更高的靈活性和高效性,尤其是在需要頻繁修改數(shù)據(jù)結(jié)構(gòu)的應(yīng)用中,本文將詳細(xì)介紹如何用C++語言實(shí)現(xiàn)一個面向?qū)ο蟮膯捂湵?并展示完整的代碼示例2025-02-02