由c++類指針未初始化引發(fā)的“思考”

C++ 類指針定義的時候沒有初始化的時候,居然可以安全的調(diào)用類內(nèi)部的成員函數(shù)而不出錯号胚。
image

結(jié)果是輸出A籽慢。
Google一通得出的結(jié)論是:初始化為NULL的類指針可以安全調(diào)用不涉及類成員變量的類成員函數(shù)而不出錯,但是如果類成員函數(shù)中調(diào)用了類成員變量則會出錯猫胁,既然賦值為NULL的情況都可以使用箱亿,那么自然不初始化的類指針同樣滿足這類情況。

假設(shè)現(xiàn)在有一個簡單的類定義如下:

class Test
{
public:
    void func(){cout << "hahaha" << endl;}
    int get(){return a+b;}
    Test():a(1),b(2){}
public:
    int a,b;
};

而之后編譯器會自動將這個類轉(zhuǎn)換成:

class Test
{
    int a,b;
};
void _test_func(Test * this);
int _test_get(Test* this);
........

類中的函數(shù)被編譯器靜態(tài)編譯了弃秆,所有非虛函數(shù)(虛函數(shù)呢届惋?別急,待會會解釋到)都可以調(diào)用菠赚,因為函數(shù)地址在編譯期間已經(jīng)確定脑豹。我們知道,類中的成員函數(shù)都是通過this指針調(diào)用成員變量的衡查,編譯器會將this指針作為默認(rèn)參數(shù)傳給類成員函數(shù)的瘩欺,如myclass.function(int a,int b) --> function(&myclass,int a,int b)
好,現(xiàn)在我們添加main函數(shù)如下:

int main()
{
    Test *p=NULL;
    p->func();//正確,沒有調(diào)用成員變量俱饿,沒有使用空的this指針
    p->get();//錯誤歌粥,this指針為空,通過this指針調(diào)用變量所以出錯
    return 0;
}

運(yùn)行結(jié)果見上面注釋拍埠,沒有調(diào)用成員變量的func()函數(shù)正確執(zhí)行阁吝,調(diào)用了成員變量的get()函數(shù)錯誤。兩者其實都傳入了空的this指針械拍,前者沒出錯僅僅是因為沒有調(diào)用this指針,而后者調(diào)用了装盯。調(diào)用成員函數(shù)的時候坷虑,函數(shù)地址是編譯期間確定的,成員函數(shù)不通過對象指針(也即當(dāng)前的p指針)去調(diào)用埂奈,對象指針僅僅作為參數(shù)傳入函數(shù)然后去調(diào)用成員變量迄损。

那如果是虛函數(shù)呢,因為虛函數(shù)要通過this指針計算vptr账磺,然后找到vtable芹敌,然后dispatch。因為this指針為空垮抗,所以在找vtable時候就會coredump了氏捞。總之這類情況下冒版,一切調(diào)用了this指針的函數(shù)都會出錯液茎,而完全不調(diào)用this指針的成員函數(shù)則沒問題。
GDB調(diào)試
總結(jié)一下:

成員函數(shù)在靜態(tài)編譯的時候地址已經(jīng)確定辞嗡,調(diào)用的時候直接通過函數(shù)地址調(diào)用捆等,this指針只是參數(shù)傳入,p->get()也一樣续室,只不過其內(nèi)部調(diào)用了空的this指針來調(diào)用成員變量栋烤,所以出錯。

再補(bǔ)充一個知識點:

類在實例化對象后挺狰,對象占內(nèi)存的大小明郭,是取決于類里的非靜態(tài)數(shù)據(jù)成員。類的 靜態(tài)數(shù)據(jù)成員她渴,非靜態(tài)成員函數(shù)达址, 靜態(tài)成員函數(shù),都不會影響對象所占內(nèi)存空間的大小趁耗。

這是為啥呢沉唠?
就像我們剛剛看到,因為靜態(tài)數(shù)據(jù)成員是屬于整個類的苛败,為該類的每個對象所共有的满葛,每個對象用到的靜態(tài)成員變量径簿,其實同一個東西;
而非靜態(tài)成員函數(shù)呢嘀韧?其實也是屬于類的篇亭,每個該類的對象,調(diào)用的非靜態(tài)成員函數(shù)锄贷,其實也都是同一個的译蒂,那為啥同一類的不同對象調(diào)用某一個非靜態(tài)成員函數(shù)會得到不同的結(jié)果呢?因為this指針哈谊却!this指針使得不同對象調(diào)用同一個函數(shù)柔昼,也可以得到不一樣的結(jié)果。

感謝http://longzxr.blog.sohu.com/213486896.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末炎辨,一起剝皮案震驚了整個濱河市捕透,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌碴萧,老刑警劉巖乙嘀,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異破喻,居然都是意外死亡虎谢,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進(jìn)店門曹质,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嘉冒,“玉大人,你說我怎么就攤上這事咆繁』渫疲” “怎么了?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵玩般,是天一觀的道長银觅。 經(jīng)常有香客問我,道長坏为,這世上最難降的妖魔是什么究驴? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮匀伏,結(jié)果婚禮上洒忧,老公的妹妹穿的比我還像新娘。我一直安慰自己够颠,他們只是感情好熙侍,可當(dāng)我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般蛉抓。 火紅的嫁衣襯著肌膚如雪庆尘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天巷送,我揣著相機(jī)與錄音驶忌,去河邊找鬼。 笑死笑跛,一個胖子當(dāng)著我的面吹牛付魔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播飞蹂,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼抒抬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了晤柄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤妖胀,失蹤者是張志新(化名)和其女友劉穎芥颈,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赚抡,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡爬坑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了涂臣。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盾计。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖赁遗,靈堂內(nèi)的尸體忽然破棺而出署辉,到底是詐尸還是另有隱情,我是刑警寧澤岩四,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布哭尝,位于F島的核電站,受9級特大地震影響剖煌,放射性物質(zhì)發(fā)生泄漏材鹦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一挤悉、第九天 我趴在偏房一處隱蔽的房頂上張望编整。 院中可真熱鬧渠牲,春花似錦、人聲如沸尤泽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽安吁。三九已至醉蚁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鬼店,已是汗流浹背网棍。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留妇智,地道東北人滥玷。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像巍棱,于是被迫代替她去往敵國和親惑畴。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內(nèi)容