對(duì)象的識(shí)別 所有的類都有構(gòu)造函數(shù)嗎筆記參考自黃色那本C++逆向揭秘
成都創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比長豐網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式長豐網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋長豐地區(qū)。費(fèi)用合理售后完善,十載實(shí)體公司更值得信賴。
1._cinit()
函數(shù)的第二個(gè)_initterm()
函數(shù)內(nèi)完成,在_initterm()
中。會(huì)先執(zhí)行__onexitinit()
函數(shù)初始化函數(shù)指針數(shù)組。在執(zhí)行每個(gè)全局對(duì)象構(gòu)造代理函數(shù)時(shí)都會(huì)先執(zhí)行對(duì)象的構(gòu)造函數(shù),然后使用atexit()
函數(shù)注冊(cè)析構(gòu)代理函數(shù)。
2. 編譯器會(huì)為每個(gè)全局對(duì)象和靜態(tài)對(duì)象建立一個(gè)中間代理的析構(gòu)函數(shù),用于傳入全局對(duì)象的this指針。(那局部對(duì)象、參數(shù)對(duì)象和返回對(duì)象呢?)
1.編譯器默認(rèn)采用的是淺拷貝,即所有拷貝的對(duì)象和原對(duì)象引用的是同一資源,比如指針會(huì)簡單地復(fù)制,而不是申請(qǐng)新的內(nèi)存空間,將指針?biāo)赶虻膬?nèi)容進(jìn)行拷貝然后復(fù)制。這種淺拷貝在對(duì)象退出其作用域時(shí)釋放資源可能引發(fā)錯(cuò)誤,將同一份資源重復(fù)釋放。
2.函數(shù)調(diào)用時(shí),如果以對(duì)象為參數(shù)而非對(duì)象指針或引用為參數(shù),并且返回一個(gè)對(duì)象。調(diào)用之前,棧中除了局部對(duì)象的內(nèi)存空間外,還有一份內(nèi)存空間用于保存返回對(duì)象。調(diào)用函數(shù)之后在該棧幀中生成一個(gè)對(duì)象,退出函數(shù)時(shí),該對(duì)象會(huì)被拷貝到返回對(duì)象中,最后回到調(diào)用者的棧幀后,再將該對(duì)象拷貝到引用該對(duì)象的變量中。
3. 設(shè)置了返回對(duì)象的原因是,如果調(diào)用者的作用域某變量要引用被調(diào)用函數(shù)中的對(duì)象,而此時(shí)已經(jīng)退出該函數(shù)棧幀,即退出了該局部變量的作用域。棧中的數(shù)據(jù)(包括作為參數(shù)傳入的返回對(duì)象的地址)可能被覆蓋從而產(chǎn)生錯(cuò)誤,所以需要在調(diào)用者的棧幀中用一塊內(nèi)存空間保存返回對(duì)象和臨時(shí)對(duì)象,將返回對(duì)象拷貝到臨時(shí)對(duì)象中,方便后續(xù)的引用。拷貝順序:被調(diào)用者中的對(duì)象–>返回對(duì)象–>臨時(shí)對(duì)象–>調(diào)用者中的對(duì)象。
4. 如果使用指針作為參數(shù)和返回值,函數(shù)內(nèi)就沒有對(duì)拷貝構(gòu)造函數(shù)的調(diào)用。這也是一個(gè)判斷參數(shù)或返回值時(shí)對(duì)象還是對(duì)象指針的方法。
void main(int argc, char* argv[]){CPerson *pPerson = new CChinese;
pPerson->ShowSpeak();
pPerson->~CPerson(); //顯式調(diào)用析構(gòu)函數(shù)
//C++放置語法:將pPerson指向的堆內(nèi)存作為CChinese類新對(duì)象的首地址,并調(diào)用其構(gòu)造函數(shù)。從而重復(fù)使用一個(gè)堆內(nèi)存。
pPerson = new(pPerson) CChinese();
delete pPerson;
}
在匯編指令中,會(huì)通過傳遞給析構(gòu)函數(shù)的參數(shù)判斷是否需要釋放堆空間,如果不需要,則會(huì)跳過delete
的調(diào)用。一些函數(shù)可能被編譯器內(nèi)聯(lián),從而沒有this指針
的傳遞和使用。
- 假如某對(duì)象為第一個(gè)成員,且該類無虛函數(shù),那么類對(duì)象的首地址就是該成員對(duì)象的首地址,如果該成員對(duì)象有虛函數(shù),則首地址就是該成員對(duì)象的虛表指針,與多重繼承的表現(xiàn)相似;
- 假如某對(duì)象為第一個(gè)成員,且該類有虛函數(shù),那么類對(duì)象的首地址時(shí)該類的虛表指針,然后才是該成員對(duì)象的內(nèi)存部分的首地址。
- 假如對(duì)象不是定義的第一個(gè)成員,則該成員對(duì)象的偏移處才是該成員對(duì)象的成員或虛表指針,此時(shí)以該成員首地址為this指針的函數(shù),即為該成員對(duì)象的成員函數(shù)(交叉引用判斷)。
void __cdecl _purecall(void)
,該函數(shù)中會(huì)結(jié)束程序,并發(fā)出錯(cuò)誤編碼信息0x19。
Release版本中,編譯器會(huì)進(jìn)行優(yōu)化,純虛函數(shù)將會(huì)被優(yōu)化掉。你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
網(wǎng)頁標(biāo)題:C++面向?qū)ο竽嫦蚬P記-創(chuàng)新互聯(lián)
轉(zhuǎn)載注明:http://jinyejixie.com/article6/peoig.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、靜態(tài)網(wǎng)站、企業(yè)建站、標(biāo)簽優(yōu)化、虛擬主機(jī)、品牌網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容