C++面試八股文:什麼是RAII?

来源:https://www.cnblogs.com/binarch/archive/2023/06/13/17478992.html
-Advertisement-
Play Games

某日二師兄參加XXX科技公司的C++工程師開發崗位第13面: > 面試官:什麼是`RAII`? > > 二師兄:`RAII`是`Resource Acquisition Is Initialization`的縮寫。翻譯成中文是資源獲取即初始化。 > > 面試官:`RAII`有什麼特點和優勢? > > ...


某日二師兄參加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++!(狗頭)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前幾天打算給博客添加一個圖片預覽的效果,可在網上找了半天也沒找到合適的庫,於是自己乾脆自己手寫了個。 ...
  • # CSS特性 ## 1、繼承性 ##### 特性: 1、子元素有預設繼承父元素樣式的特點(**子承父業**) 2、可以繼承的常見屬性(文字控制屬性都可以繼承) 1.color 2.font-style、font-weight、font-size、font-family 3.text-indent, ...
  • 博客推行版本更新,成果積累制度,已經寫過的博客還會再次更新,不斷地琢磨,高質量高數量都是要追求的,工匠精神是學習必不可少的精神。因此,大家有何建議歡迎在評論區踴躍發言,你們的支持是我最大的動力,你們敢投,我就敢肝 ...
  • 遠程線程註入是最常用的一種註入技術,在應用層註入是通過`CreateRemoteThread`這個函數實現的,通過該函數通過創建線程並調用 `LoadLibrary` 動態載入指定的DLL來實現註入,而在內核層同樣存在一個類似的內核函數`RtlCreateUserThread`,但需要註意的是此函數... ...
  • 生活中我們經常談及 “架構”,那麼到底什麼是 “架構”,Robert C.Martin《架構整潔之道》中的定義:軟體架構是指設計軟體的人為軟體賦予的形狀,這個形狀是指系統如何被劃分為組件 (Components),各個組件如何排列(Arrangement),組件之間如何溝通(Communicatio... ...
  • # 下載 https://www.wxwidgets.org/downloads/ 下載壓縮包即可 ![image](https://img2023.cnblogs.com/blog/916065/202306/916065-20230614040303993-2082032985.png) # 編 ...
  • # 問題背景 nexus3 的 admin 賬號密碼忘記了,需要重置。 # 環境說明 ``` nexus 基於 docker-compose 部署,版本 nexus3.26 docker 鏡像 sonatype/nexus3:3.26.1 ``` # 操作步驟 參考: https://support ...
  • ## 1、求解器 ### 1.1 複製源碼 本案例以icoFoam為例,複製【openFOAM/OpenFOAM-9/applications/solvers/incompressible/icoFoam】文件夾至run文件夾下(我的是【openFOAM/mtl-9/run/solvers/inco ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...