C 建構函式與析構函式

2021-12-29 19:41:35 字數 1884 閱讀 2548

**:

#pragma once

#include 

using namespace std;

void test();

#include "a.h"

**:class mytest

~mytest()

}; void test()

#include 

#include "a.h"

int main() 

int main()

0041125d  jmp         callmyfunc (411520h)

void callmyfunc()

00411546  lea         ecx,[mytestclass]

00411549  call        mytest::~mytest (41102dh)

0041154e  push        edx  

0041154f  mov         ecx,ebp

00411551  push        eax  

00411552  lea         edx,[ (411574h)]

00411558  call        @ilt+170(@_rtc_checkstackvars@8) (4110afh)

0041155d  pop         eax  

0041155e  pop         edx  

0041155f  pop         edi  

00411560  pop         esi  

00411561  pop         ebx  

00411562  add         esp,0cch

00411568  cmp         ebp,esp

0041156a  call        @ilt+415(__rtc_checkesp) (4111a4h)

0041156f  mov         esp,ebp

00411571  pop         ebp  

00411572  ret

call 指令

cpu執行call指令,進行兩步操作:

(1)將當前的 ip 或 cs和ip 壓入棧中;

(2)轉移。

call 指令在實現轉移之前, 要將返回位址存入堆疊的, 以便子程可以通過 ret 指令返回到 call 指令下面的指令接著執行;

jmp 就沒用這些事兒, 直接過去就過去了, 以後的執行流程全由那裡的說了算. 當然了, 一些特殊的執行流程控制技巧除外.

大概的意思,彙編我也不怎麼懂.

004114de  call        callmyfunc (41125dh)

0041125d  jmp         callmyfunc (411520h)

然後直接jmp 到callmyfunc函式的位址.

callmyfunc函式結束的後面,加入了呼叫析構的**如下:

00411546  lea         ecx,[mytestclass]

00411549  call        mytest::~mytest (41102dh)

現在大概知道c++析構的原理了,編譯器對呼叫函式做了個子過程包裝,

然後加入析構呼叫**.最後返回.

這樣看來,如果函式中產生異常,可能會導致析構函式不能正確的呼叫,從而導致記憶體洩漏.

根據分析,繼續測試.

摘自 天下

c 建構函式與析構函式

一 建構函式 c 提供建構函式來處理物件的初始化,建構函式是一種特殊的成員函式,與其他的成員函式不同,不需要使用者來呼叫他,而是在建立物件時自動執行。它的特點是 函式名和類名相同,沒有返回值,可以過載 如果程式中未宣告,則系統自動產生出乙個預設的建構函式,預設的建構函式時不帶引數的。比如 stude...

C 建構函式與析構函式

c 規定,每個類必須有預設的建構函式,沒有建構函式就不能建立物件。若沒有提供任何建構函式,那麼c 提供自動提供乙個預設的建構函式,該預設建構函式是乙個沒有引數的建構函式,它僅僅負責建立物件而不做任何賦值操作。只要類中提供了任意乙個建構函式,那麼c 就不再自動提供預設建構函式。類物件的定義和變數的定義...

C 建構函式與析構函式

建構函式 對於c 的建構函式,暫且將其分為以下幾類 1.預設建構函式 2.隱士轉換建構函式 3.拷貝建構函式 4.其它建構函式 1.預設建構函式表示沒有任何引數的建構函式,當自定義任何建構函式以後,將不再自動建立預設建構函式,當然,預設建構函式啥也不幹,程式設計師關心係數頓時大跌。關於預設建構函式還...