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