国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C++面試八股文:什么是智能指針?

這篇具有很好參考價(jià)值的文章主要介紹了C++面試八股文:什么是智能指針?。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

某日二師兄參加XXX科技公司的C++工程師開發(fā)崗位第19面:

面試官:什么是智能指針?

二師兄:智能指針是C++11引入的類模板,用于管理資源,行為類似于指針,但不需要手動(dòng)申請(qǐng)、釋放資源,所以稱為智能指針。

面試官:C++11引入了哪些智能指針?

二師兄:三種,分別是shared_ptrunique_ptr、和weak_ptr

面試官:說一說三種指針的特征及用途。

二師兄:好的。shared_ptr使用了引用計(jì)數(shù)(use count)技術(shù),當(dāng)復(fù)制個(gè)shared_ptr對(duì)象時(shí),被管理的資源并沒有被復(fù)制,而是增加了引用計(jì)數(shù)。當(dāng)析構(gòu)一個(gè)shared_ptr對(duì)象時(shí),也不會(huì)直接釋放被管理的的資源,而是將引用計(jì)數(shù)減一。當(dāng)引用計(jì)數(shù)為0時(shí),才會(huì)真正的釋放資源。shared_ptr可以方便的共享資源而不必創(chuàng)建多個(gè)資源。

C++面試八股文:什么是智能指針?

二師兄:unique_ptr則不同。unique_ptr獨(dú)占資源,不能拷貝,只能移動(dòng)。移動(dòng)過后的unique_ptr實(shí)例不再占有資源。當(dāng)unique_ptr被析構(gòu)時(shí),會(huì)釋放所持有的資源。

C++面試八股文:什么是智能指針?

二師兄:weak_ptr可以解決shared_ptr所持有的資源循環(huán)引用問題。weak_ptr在指向shared_ptr時(shí),并不會(huì)增加shared_ptr的引用計(jì)數(shù)。所以weak_ptr并不知道shared_ptr所持有的資源是否已經(jīng)被釋放。這就要求在使用weak_ptr獲取shared_ptr時(shí)需要判斷shared_ptr是否有效。

struct Boo;
struct Foo{
    std::shared_ptr<Boo> boo;
};
struct Boo{
    std::shared_ptr<Foo> foo;
};

二師兄:Foo中有一個(gè)智能指針指向Goo,而Goo中也有一根智能指針指向Foo,這就是循環(huán)引用,我們可以使用weak_ptr來解決這個(gè)文通。

Boo boo;
auto foo = boo.foo.lock();
if(foo)
{
    //這里通過獲取到了foo,可以使用
}else
{
    //這里沒有獲取到,不能使用
}

面試官:好的。智能指針是線程安全的嗎?

二師兄:是的。拋開類型T,智能指針是類型安全的。

面試官:為什么?

二師兄:因?yàn)橹悄苤羔樀讓邮褂玫囊糜?jì)數(shù)是atomic的原子變量,原子變量在自增自減時(shí)是線程安全的,這保證了多線程讀寫智能指針時(shí)是安全的。

面試官:好的。為什么盡量不要使用裸指針初始化智能指針?

二師兄:因?yàn)榭赡艽嬖谕粋€(gè)裸指針初始了多個(gè)智能指針,在智能指針析構(gòu)時(shí)會(huì)造成資源的多次釋放。

面試官:為什么不要從智能指針中返回裸指針呢?

二師兄:是因?yàn)槿绻祷氐穆阒羔槺会尫帕?,智能指針持有的資源也失效了,對(duì)智能指針的操作是未定義的行為。

面試官:智能指針能夠持有數(shù)組嗎?

二師兄:shread_ptrunique_ptr都可以持有數(shù)組。

面試官:那你知道在釋放資源的時(shí)候兩者有什么不同嗎?

二師兄:這個(gè)暫時(shí)還不清楚。。

面試官:可以使用靜態(tài)對(duì)象初始化智能指針嗎?

二師兄:讓我想想。。不可以,因?yàn)殪o態(tài)對(duì)象的生命周期和進(jìn)程一樣長,而智能指針的析構(gòu)的時(shí)候會(huì)導(dǎo)致靜態(tài)資源被釋放。這會(huì)導(dǎo)致未定義的行為。

面試官:如果需要在一個(gè)類中實(shí)現(xiàn)一個(gè)方法,這個(gè)方法返回這個(gè)類的shread_ptr實(shí)例,需要注意哪些東西?

二師兄:需要繼承std::enable_shared_from_this類,方法返回shared_from_this()。

struct Foo : public std::enable_shared_from_this<Foo>
{
    std::shared_ptr<Foo> get_foo()
    {
        return shared_from_this();
    }
};

面試官:為什么不直接返回this指針?

二師兄:額。。。不太清楚,但是這應(yīng)該是個(gè)范式。

面試官:好的,今天的面試結(jié)束了,請(qǐng)回去等通知吧。

今天二師兄的表現(xiàn)不錯(cuò),讓我們看看一些回答的不太理想的地方吧。

智能指針是線程安全的嗎?

很遺憾,使用不當(dāng)?shù)臅r(shí)候并不是。

#include <iostream>
#include <memory>
#include <thread>
#include <chrono>

struct Foo
{
    Foo(int i):i_(i){}
    void print() {std::cout << i_ << std::endl;}
    int i_;
};

int main(int argc, char const *argv[])
{
    {
        auto shptr = std::make_shared<Foo>(42);
        std::thread([&shptr](){
            std::this_thread::sleep_for(std::chrono::seconds(1));
            shptr->print();
        }).detach();
    }
    std::this_thread::sleep_for(std::chrono::seconds(2));
    return 0;
}
// g++ test.cpp -o test -lpthread
// ./test 
// Segmentation fault

當(dāng)我們向另一個(gè)線程傳遞智能指針的引用時(shí),由于use count并沒有加1,在shptr析構(gòu)時(shí)直接銷毀了管理的Foo實(shí)例,所以在線程中執(zhí)行shptr->print()會(huì)引發(fā)coredump

修改起來也很簡單,把std::thread([&shptr]()改成std::thread([shptr]()即可。記住,智能指針盡量不要傳引用

知道在釋放資源的時(shí)候shread_ptrunique_ptr有什么不同嗎?

這里需要在shared_ptr構(gòu)造時(shí)傳入deleter,用來銷毀持有的數(shù)組,而unique_ptr無需此操作,因?yàn)?code>unique_ptr重載了unique_ptr(T[])。

get_foo()方法為什么不直接返回this指針?

參考 ”為什么盡量不要使用裸指針初始化智能指針“。聰明的小伙伴,想想如果多次調(diào)用get_foo()會(huì)發(fā)生什么?

好了,今天二師兄的面試之旅到這里就結(jié)束了。感謝小伙伴的耐心閱讀。如果您覺得還不錯(cuò),請(qǐng)多多支持二師兄,拜謝~

關(guān)注我,帶你21天“精通”C++?。ü奉^)文章來源地址http://www.zghlxwxcb.cn/news/detail-490868.html

到了這里,關(guān)于C++面試八股文:什么是智能指針?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • C++面試八股文:什么是左值,什么是右值?

    某日二師兄參加XXX科技公司的C++工程師開發(fā)崗位第16面: 面試官:什么是左值,什么是右值? 二師兄:簡單來說,左值就是可以使用 符號(hào)取地址的值,而右值一般不可以使用 符號(hào)取地址。 二師兄:一般左值存在內(nèi)存中,而右值存在寄存器中。 二師兄:嚴(yán)格意義上分,右值

    2024年02月09日
    瀏覽(17)
  • C++面試八股文:override和finial關(guān)鍵字有什么作用?

    C++面試八股文:override和finial關(guān)鍵字有什么作用?

    某日二師兄參加XXX科技公司的C++工程師開發(fā)崗位第22面: (二師兄好苦逼,節(jié)假日還在面試。。。) 面試官:C++的繼承了解嗎? 二師兄:(不好意思,你面到我的強(qiáng)項(xiàng)了。。)了解一些。 面試官:什么是虛函數(shù),為什么需要虛函數(shù)? 二師兄:虛函數(shù)允許在基類中定義一個(gè)函

    2024年02月10日
    瀏覽(20)
  • C++面試八股文:技術(shù)勘誤

    C++面試八股文:技術(shù)勘誤

    不知不覺,《C++面試八股文》已經(jīng)更新30篇了,這是我第一次寫技術(shù)博客,由于個(gè)人能力有限,出現(xiàn)了不少紕漏,在此向各位讀者小伙伴們致歉。 為了不誤導(dǎo)更多的小伙伴,以后會(huì)不定期的出勘誤文章,請(qǐng)各位小伙伴留意。 在《C++面試八股文:C++中,設(shè)計(jì)一個(gè)類要注意哪些東

    2024年02月11日
    瀏覽(30)
  • C++面試八股文:如何避免死鎖?

    某日二師兄參加XXX科技公司的C++工程師開發(fā)崗位第31面: 面試官:什么是鎖?有什么作用? 二師兄:在C++中,鎖(Lock)是一種同步工具,用于保護(hù)共享資源,防止多個(gè)線程同時(shí)訪問,從而避免數(shù)據(jù)競(jìng)爭和不一致。 面試官:有哪些鎖? 二師兄:從種類上分,可以分為普通鎖、

    2024年02月12日
    瀏覽(28)
  • C++面試八股文:了解位運(yùn)算嗎?

    某日二師兄參加XXX科技公司的C++工程師開發(fā)崗位第12面: 面試官:了解位運(yùn)算嗎? 二師兄:了解一些。(我很熟悉) 面試官:請(qǐng)列舉以下有哪些位運(yùn)算? 二師兄:按位與( )、按位或( | )、按位異或( ^ ),按位取反( ~ )、左移( )和右移( )。 面試官:好的。那你

    2024年02月08日
    瀏覽(23)
  • C++面試八股文:用過STL嗎?

    某日二師兄參加XXX科技公司的C++工程師開發(fā)崗位第21面: 面試官:用過STL嗎? 二師兄:(每天都用好嗎。。)用過一些。 面試官:你知道STL是什么? 二師兄:STL是指標(biāo)準(zhǔn)模板庫( Standard Template Library ),是C++區(qū)別于C語言的特征之一。 面試官:那你知道STL的六大部件是什么

    2024年02月09日
    瀏覽(15)
  • java八股文面試[多線程]——什么是守護(hù)線程

    java八股文面試[多線程]——什么是守護(hù)線程

    ?知識(shí)來源: 【2023年面試】什么是守護(hù)線程_嗶哩嗶哩_bilibili

    2024年02月11日
    瀏覽(26)
  • C++面試八股文:std::vector了解嗎?

    某日二師兄參加XXX科技公司的C++工程師開發(fā)崗位第23面: 面試官: vector 了解嗎? 二師兄:嗯,用過。 面試官:那你知道 vector 底層是如何實(shí)現(xiàn)的嗎? 二師兄: vector 底層使用動(dòng)態(tài)數(shù)組來存儲(chǔ)元素對(duì)象,同時(shí)使用 size 和 capacity 記錄當(dāng)前元素的數(shù)量和當(dāng)前動(dòng)態(tài)數(shù)組的容量。如果

    2024年02月10日
    瀏覽(30)
  • C++面試八股文:std::deque用過嗎?

    C++面試八股文:std::deque用過嗎?

    某日二師兄參加XXX科技公司的C++工程師開發(fā)崗位第26面: 面試官: deque 用過嗎? 二師兄:說實(shí)話,很少用,基本沒用過。 面試官:為什么? 二師兄:因?yàn)槭褂盟膱?chǎng)景很少,大部分需要性能、且需要自動(dòng)擴(kuò)容的時(shí)候使用 vector ,需要隨機(jī)插入和刪除的時(shí)候可以使用 list 。

    2024年02月11日
    瀏覽(25)
  • C++面試八股文:如何實(shí)現(xiàn)一個(gè)strncpy函數(shù)?

    C++面試八股文:如何實(shí)現(xiàn)一個(gè)strncpy函數(shù)?

    某日二師兄參加XXX科技公司的C++工程師開發(fā)崗位第31面: 面試官: strcpy 函數(shù)使用過吧? 二師兄:用過。 面試官:這個(gè)函數(shù)有什么作用? 二師兄:主要用做字符串復(fù)制,將于字符從一個(gè)位置復(fù)制到另一個(gè)位置。 面試官: strncpy 函數(shù)也使用過吧,和 strcpy 有何不同? 二師兄:

    2024年02月11日
    瀏覽(38)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包