C++ 一道騰訊面試題深入剖析

騰訊面試題:
以下代碼是否完全正確,執(zhí)行可能得到的結(jié)果是____。
class A{ int i; }; class B{ A *p; public: B(){p=new A;} ~B(){delete p;} }; void sayHello(B b){ } int main(){ B b; sayHello(b); }
A.程序正常運行
B.程序編譯錯誤
C.程序崩潰
D.程序死循環(huán)
分析:
代碼中定義了兩個類,類A、類B和一個全局函數(shù)sayHello。類A中定義一個int類型的成員變量。類B中定義了一個A*類型的成員變量,且類B在初始化的時候構(gòu)造了類A的一個實例,在類B析構(gòu)時釋放了成員變量p(delete p)。全局函數(shù)sayHello的參數(shù)是類B的一個實例。
首先程序中沒有編譯錯誤,也沒有死循環(huán)(程序中沒有循環(huán)哪里來的死循環(huán))。有些初學者可能會說main函數(shù)沒有寫return 0,main函數(shù)不顯性的寫return,編譯器也會幫你做的。
那么根據(jù)我們這十幾年應試教育考試的經(jīng)驗,這段代碼出問題的概率很大,不賣關(guān)子了,直接說吧:當類中存在指針類型的成員變量時賦值和析構(gòu)要格外注意,這道題的問題就出在類B對象b中的指針p被析構(gòu)了兩次。
具體分析一下,當執(zhí)行完成B b這句話后,在b中就構(gòu)造了一個類A的指針對象p,當調(diào)用sayHello(b)函數(shù)時系統(tǒng)將會調(diào)用類B的賦值構(gòu)造函數(shù)構(gòu)造一個類B的實例bStep(為了方便下面的敘述隨便起了一個名字)傳入到sayHello函數(shù)中(問題就出在bStep這個實例中),這里當sayHello執(zhí)行完成后,之前構(gòu)造的實例bStep將被析構(gòu)(執(zhí)行delete p)。然后程序繼續(xù)開心的執(zhí)行,直到執(zhí)行完main函數(shù)后系統(tǒng)將會析構(gòu)b,當b被析構(gòu)時將再次執(zhí)行delete p。這樣p就被析構(gòu)了兩遍導致程序崩潰。
我們把代碼增加一些輸出信息后大家就更容易看了:
class B{ A *p; public: B(){ printf("構(gòu)造\n"); p = new A; } ~B(){ printf("析構(gòu)\n"); delete p; } B(const B &b){ printf("賦值構(gòu)造\n"); } }; void sayHello(B b){ } int main() { B b; sayHello(b); }
相關(guān)文章
- 這篇文章主要介紹了騰訊公司c++面試小結(jié),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2020-03-02
- 這篇文章主要介紹了 C++ 面試題目(整理自牛客網(wǎng)),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2020-02-13
華為校招 C++崗面試經(jīng)歷總結(jié)【筆試+一面+二面+Offer】
這篇文章主要介紹了華為校招 C++崗面試經(jīng)歷,總結(jié)分析了華為校招C++崗位的筆試題,以及一面、二面到最終拿到Offer的經(jīng)歷與相關(guān)經(jīng)驗感想,需要的朋友可以參考下2019-11-28- 這篇文章主要介紹了C++面試常見算法題與參考答案,總結(jié)分析了C++面試中遇到的常見算法題與相應的參考答案,需要的朋友可以參考下2019-11-20
- 這篇文章主要介紹了C++必備面試題與參考答案,結(jié)合大量經(jīng)典實例總結(jié)分析了C++面試過程中經(jīng)常遇到的各種概念、原理、算法相關(guān)問題及參考答案,需要的朋友可以參考下2019-10-31
- 這篇文章主要介紹了C/C++經(jīng)典面試題(附答案),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-10-23
- 這篇文章主要介紹了C/C++求職者必備的20道面試題與參考答案,總結(jié)分析了C/C++相關(guān)的常見概念、原理、知識點與注意事項,需要的朋友可以參考下2019-10-10
- 這篇文章主要介紹了騰訊的外包c++面試經(jīng)歷,總結(jié)記錄了一次騰訊C++面試的經(jīng)歷,包括面試的流程、面試題目與相應的參考答案,需要的朋友可以參考下2019-09-29
- 這篇文章主要介紹了阿里面試必會的20道C++面試題與參考答案,涉及C++指針、面向?qū)ο蟆⒑瘮?shù)等相關(guān)特性與使用技巧,需要的朋友可以參考下2019-09-26
- 這篇文章主要介紹了經(jīng)典C++筆試題目與參考答案,總結(jié)分析了C++常見的各種面試題目,包含C++常見知識點、技術(shù)難點、算法等,需要的朋友可以參考下2019-09-10