Ґ­вЁдЁЄжЁп Є®­бвагЄв®а Ё ¤ҐбвагЄв®а

"в®, зв® ­Ґ бгйҐбвўгҐв ў ®¤­® ⥪б⥠(®¤­® ў®§®¦­® ЁаҐ), ®¦Ґв бгйҐбвў®ўвм ў ¤агЈЁе ⥪бве (ў®§®¦­ле Ёае)"

⥧Ёб ᥭ⨪Ё ў®§®¦­ле Ёа®ў

Љ®­бвагЄв®а, ў бЁ«г бў®ҐЈ® ўв®вЁзҐбЄ®Ј® ўл§®ў ЇаЁ ᮧ¤­ЁЁ ­®ў®Ј® нЄ§ҐЇ«па ®ЎкҐЄв, – ЇҐаўп Ї® бзҐвг ўл§лўҐп дг­ЄжЁп ®ЎкҐЄв. ’Є ЄЄЁҐ б«®¦­®бвЁ ў ҐЈ® Ё¤Ґ­вЁдЁЄжЁЁ? ЉҐ­м ЇаҐвЄ­®ўҐ­Ёп ў в®, зв® Є®­бвагЄв®а дЄг«мввЁўҐ­, в.Ґ. ®¦Ґв ЇаЁбгвбвў®ўвм ў ®ЎкҐЄвҐ, ®¦Ґв Ё ­Ґ ЇаЁбгвбвў®ўвм. Џ®нв®г, ᮢᥠ­Ґ дЄв, зв® ЇҐаўп ўл§лўҐп дг­ЄжЁп – Є®­бвагЄв®а!

‡Ј«п­гў ў ®ЇЁб­ЁҐ п§лЄ ‘Ё++, ®¦­® ®Ў­аг¦Ёвм, зв® Є®­бвагЄв®а ­Ґ ў®§ўайҐв ­ЁЄЄ®Ј® §­зҐ­Ёп, зв® ­ҐеаЄвҐа­® ¤«п ®Ўлз­ле дг­ЄжЁ©, ®¤­Є®, ўбҐ ¦Ґ ­Ґ ­бв®«мЄ® ।Є® ўбваҐзҐвбп, зв®Ўл ®¤­®§­з­® Ё¤Ґ­вЁдЁжЁа®ўвм Є®­бвагЄв®а. ЉЄ ¦Ґ в®Ј¤ Ўлвм?

‚лагзҐв в® ®Ўбв®п⥫мбвў®, зв® Ї® бв­¤авг Є®­бвагЄв®а ­Ґ ¤®«¦Ґ­ ўв®вЁзҐбЄЁ ўл§лўвм ЁбЄ«о祭Ёп, ¤¦Ґ Ґб«Ё ®вўҐбвЁ Їпвм Ї®¤ ®ЎкҐЄв ­Ґ 㤫®бм. ђҐ«Ё§®ўвм нв® вॡ®ў­ЁҐ ®¦­® ­®¦Ґбвў® ৫Ёз­ле бЇ®б®Ў®ў, ­® ўбҐ, ўЁ¤Ґ­­лҐ ­®© Є®ЇЁ«пв®ал, Їа®бв® Ї®Ґйов ЇҐаҐ¤ ўл§®ў® Є®­бвагЄв®а Їа®ўҐаЄг ­ ­г«Ґў®© 㪧⥫м, ЇҐаҐ¤ўп Ґг гЇаў«Ґ­ЁҐ в®«мЄ® ЇаЁ г¤з­® ўл¤Ґ«Ґ­ЁЁ ЇпвЁ ¤«п ®ЎкҐЄв. ЌЇа®вЁў, ўбҐ ®бв«м­лҐ дг­ЄжЁЁ ®ЎкҐЄв ўл§лўовбп ўбҐЈ¤ – ¤¦Ґ ЇаЁ ­ҐгбЇҐи­® ўл¤Ґ«Ґ­ЁЁ ЇпвЁ. ‚Ґа­ҐҐ, Їлвовбп ўл§лўвмбп, ­® ­г«Ґў®© 㪧⥫м (ў®§а饭­л© ЇаЁ ®иЁЎЄҐ ®вўҐ¤Ґ­Ёп ЇпвЁ) ЇаЁ ЇҐаў®© ¦Ґ Ї®ЇлвЄҐ ®Ўа饭Ёп ўл§лўҐв ЁбЄ«о祭ЁҐ, ЇҐаҐ¤ўп "Ўа§¤л Їаў«Ґ­Ёп" ®ЎаЎ®взЁЄг ᮮ⢥вбвўго饩 ЁбЄ«озЁвҐ«м­®© бЁвгжЁЁ.

’ЄЁ ®Ўа§®, дг­ЄжЁп, "®Є®«мж®ў­­п" Їа®ўҐаЄ®© ­г«Ґў®Ј® 㪧⥫п, Ё Ґбвм Є®­бвагЄв®а, ­Ё зв® Ё­®Ґ. ’Ґ®аҐвЁзҐбЄЁ, ўЇа®зҐ, Ї®¤®Ў­п Їа®ўҐаЄ ®¦Ґв ЇаЁбгвбвў®ўвм Ё ЇаЁ ўл§®ўҐ ¤агЈЁе дг­ЄжЁ©, Є®­бвагЄв®а® ­Ґ пў«пойЁебп, ­®… ў® ўбпЄ® б«гзҐ ­Ґ ­ ЇаЄвЁЄҐ б ЄЄЁ ҐйҐ ­Ґ ЇаЁе®¤Ё«®бм ўбваҐзвмбп.

„ҐбвагЄв®а, ЄЄ Ё Є®­бвагЄв®а дЄг«мввЁўҐ­, в.Ґ. Ї®б«Ґ¤­пп ўл§лўҐп дг­ЄжЁп ®ЎкҐЄв ­Ґ дЄв, зв® ¤ҐбвагЄв®а. ’Ґ ­Ґ Ґ­ҐҐ, ®в«ЁзЁвм ¤ҐбвагЄв®а ®в «оЎ®© ¤агЈ®© дг­ЄжЁЁ ®зҐ­м Їа®бв® – ®­ ўл§лўҐвбп в®«мЄ® ЇаЁ १г«мввЁў­® ᮧ¤­ЁЁ ®ЎкҐЄв (в.Ґ. гбЇҐи­® ўл¤Ґ«Ґ­ЁЁ ЇпвЁ) Ё ЁЈ­®аЁагҐвбп ў Їа®вЁў­® б«гзҐ. ќв® – ¤®ЄгҐ­вЁа®ў­­®Ґ бў®©бвў® п§лЄ, б«Ґ¤®ўвҐ«м­®, ®Ўп§вҐ«м­®Ґ Є ५Ё§жЁЁ ўбҐЁ Є®ЇЁ«пв®аЁ. ’ЄЁ ®Ўа§®, ў Є®¤ Ї®ҐйҐвбп вЄ®Ґ ¦Ґ "Є®«мж®", ЄЄ Ё г Є®­бвагЄв®а, ­® ­ЁЄЄ®© Їгв­Ёжл ­Ґ ў®§­ЁЄҐв, в.Є. Є®­бвагЄв®а ўл§лўҐвбп ўбҐЈ¤ ЇҐаўл (Ґб«Ё ®­ Ґбвм), ¤ҐбвагЄв®а – Ї®б«Ґ¤­Ё.

Ћб®Ўл© б«гз© ЇаҐ¤бвў«пҐв ®ЎкҐЄв, 楫ЁЄ® б®бв®пйЁ© Ё§ ®¤­®Ј® Є®­бвагЄв®а (Ё«Ё ¤ҐбвагЄв®а) – Ї®Їа®Ўг©, а§ЎҐаЁбм, б зҐ л ЁҐҐ ¤Ґ«®. € ৮Ўавмбп ®¦­®! ‡ ўл§®ў® Є®­бвагЄв®а ЇаЄвЁзҐбЄЁ ўбҐЈ¤ ЇаЁбгвбвўгҐв Є®¤, ®Ў­г«пойЁ© this ў б«гзҐ ­Ґг¤«®Ј® ўл¤Ґ«Ґ­Ёп ЇпвЁ, - г ¤ҐбвагЄв®а нв®Ј® ­Ґв! „«ҐҐ – ¤ҐбвагЄв®а ®Ўлз­® ўл§лўҐвбп ­Ґ ­ҐЇ®б।б⢥­­® Ё§ вҐаЁ­бЄ®© Їа®жҐ¤гал, Ё§ дг­ЄжЁЁ-®ЎҐавЄЁ, ўл§лўо饩 Ї®Ё® ¤ҐбвагЄв®а Ё ®ЇҐав®а delete, ®бў®Ў®¦¤ойЁ© §­пвго ®ЎкҐЄв® Їпвм. ’Є, зв® ®в«ЁзЁвм Є®­бвагЄв®а ®в ¤ҐбвагЄв®а ўЇ®«­Ґ ®¦­®!



„ў©вҐ, ¤«п «гз襣® гпб­Ґ­Ёп бЄ§­­®Ј® абб®ваЁ б«Ґ¤гойЁ© ЇаЁҐа:

#include

class MyClass{

public:

MyClass(void);

void demo(void);

~MyClass(void);

};

MyClass::MyClass()

{

printf("Constructor\n");

}

MyClass::~MyClass()

{

printf("Destructor\n");

}

void MyClass::demo(void)

{

printf("MyClass\n");

}

main()

{

MyClass *zzz = new MyClass;

zzz->demo();

delete zzz;

}

‹ЁбвЁ­Ј 38 „Ґ®­бважЁп Є®­бвагЄв®а Ё ¤ҐбвагЄв®а

ђҐ§г«мвв ҐЈ® Є®ЇЁ«пжЁЁ ў ®ЎйҐ б«гзҐ ¤®«¦Ґ­ ўлЈ«п¤Ґвм вЄ:

Constructor proc near ; CODE XREF: main+11p

; дг­ЄжЁп Є®­бвагЄв®а. ’®, зв® нв® ЁҐ­­® Є®­бвагЄв®а ®¦­® Ї®­пвм Ё§ ५Ё§жЁЁ

; ҐЈ® ўл§®ў (б. main)

push esi

mov esi, ecx

push offset aConstructor ; "Constructor\n"

call printf

add esp, 4

mov eax, esi

pop esi

retn

Constructor endp

Destructor proc near ; CODE XREF: __destructor+6p

; дг­ЄжЁп ¤ҐбвагЄв®а. ’®, зв® нв® ЁҐ­­® ¤ҐбвагЄв®а, ®¦­® Ї®­пвм Ё§ ५Ё§жЁЁ

; ҐЈ® ўл§®ў (б. main)

push offset aDestructor ; "Destructor\n"

call printf

pop ecx

retn

Destructor endp

demo proc near ; CODE XREF: main+1Ep

; ®Ўлз­п дг­ЄЁп demo

push offset aMyclass ; "MyClass\n"

call printf

pop ecx

retn

demo endp

main proc near ; CODE XREF: start+AFp

push esi

push 1

call ??2@YAPAXI@Z ; operator new(uint)

add esp, 4

; ўл¤Ґ«пҐ Їпвм ¤«п ­®ў®Ј® ®ЎкҐЄв

; в®з­ҐҐ, ЇлвҐбп н⮠ᤥ«вм

test eax, eax

jz short loc_0_40105A

; Џа®ўҐаЄ гбЇҐи­®бвЁ ўл¤Ґ«Ґ­Ёп ЇпвЁ ¤«п ®ЎкҐЄв.

; ЋЎавЁвҐ ў­Ё­ЁҐ: Єг¤ ­Їаў«Ґ­ jump.

; Ћ­ ­Їаў«Ґ­ ­ Ё­бвагЄжЁо XOR ESI,ESI, ®Ў­г«пойго гЄ§вҐ«м ­ ®ЎкҐЄв –

; ЇаЁ Ї®ЇлвЄҐ ЁбЇ®«м§®ў­Ёп ­г«Ґў®Ј® гЄ§вҐ«п ў®§­ЁЄ­Ґв ЁбЄ«о祭ЁҐ,

; ­® Є®­бвагЄв®а ­Ґ ¤®«¦Ґ­ ўл§лўвм ЁбЄ«о祭ЁҐ ¤¦Ґ Ґб«Ё Їпвм Ї®¤ ®ЎкҐЄв



; ®вўҐбвЁ ­Ґ 㤫®бм.

; Џ®нв®г, Є®­бвагЄв®а Ї®«гзҐв гЇаў«Ґ­ЁҐ в®«мЄ® ЇаЁ гбЇҐи­® ®вў®¤Ґ ЇпвЁ!

; ‘«Ґ¤®ўвҐ«м­®, дг­ЄжЁп, ­е®¤пйпбп ¤® XOR ESI,ESI, Ё Ґбвм Є®­бвагЄв®а!!!

; € л б㥫Ё ­¤Ґ¦­® Ё¤Ґ­вЁдЁжЁа®ўвм ҐҐ.

mov ecx, eax

; Ј®в®ўЁ 㪧⥫м this

call Constructor

; нв дг­ЄжЁп – Є®­бвагЄв®а, в.Є. ўл§лўҐвбп в®«мЄ® ЇаЁ г¤з­® ®вў®¤Ґ ЇпвЁ

mov esi, eax

jmp short loc_0_40105C

loc_0_40105A: ; CODE XREF: main+Dj

xor esi, esi

; ®Ў­г«пҐ гЄ§вҐ«м ­ ®ЎкҐЄв, зв®Ўл ўл§ўвм ЁбЄ«о祭ЁҐ ЇаЁ Ї®ЇлвЄҐ ҐЈ®

; ЁбЇ®«м§®ў­Ёп

; ‚­Ё­ЁҐ: Є®­бвагЄв®а ­ЁЄ®Ј¤ ­Ґ ўл§лўҐв ЁбЄ«о祭Ёп, Ї®нв®г,

; ­Ё¦Ґ«Ґ¦йп дг­ЄжЁп Ја­вЁа®ў­­® ­Ґ пў«пҐвбп Є®­бвагЄв®а®

loc_0_40105C: ; CODE XREF: main+18j

mov ecx, esi

; Ј®в®ўЁ 㪧⥫м this

call demo

; ўл§лўҐ ®Ўлз­го дг­ЄжЁо ®ЎкҐЄв

test esi, esi

jz short loc_0_401070

; Їа®ўҐаЄ 㪧⥫п this ­ NULL. „ҐбвагЄв®а ўл§лўвмбп в®«мЄ® ў в® б«гзҐ

; Ґб«Ё Їпвм Ї®¤ ®ЎкҐЄв Ўл« ®вўҐ¤Ґ­ (Ґб«Ё ¦Ґ ®­ ­Ґ Ўл« ®вўҐ¤Ґ­

; ®бў®Ў®¦¤вм ®б®Ў® ­ҐзҐЈ®)

; вЄЁ ®Ўа§®, б«Ґ¤гойп дг­ЄжЁп – ЁҐ­­® ¤ҐбвагЄв®а, ­Ґ зв®-­ЁЎг¤м ҐйҐ

push 1

; Є®«ЁзҐбвў® Ў©в ¤«п ®бў®Ў®¦¤Ґ­Ёп (­Ґ®Ўе®¤Ё® ¤«п delete)

mov ecx, esi

; Ј®в®ўЁ 㪧⥫м this

call __destructor

; ўл§лўҐ ¤ҐбвагЄв®а

loc_0_401070: ; CODE XREF: main+25j

pop esi

retn

main endp

__destructor proc near ; CODE XREF: main+2Bp

; дг­ЄжЁп ¤ҐбвагЄв®а. ЋЎавЁвҐ ў­Ё­ЁҐ, зв® ¤ҐбвагЄв®а ®Ўлз­® ўл§лўҐвбп

; Ё§ в®© ¦Ґ дг­ЄжЁЁ, зв® Ё delete (е®вп вЄ ЎлўҐв Ё ­Ґ ўбҐЈ¤, ­® ®зҐ­м збв®)

arg_0 = byte ptr 8

push ebp

mov ebp, esp

push esi

mov esi, ecx

call Destructor

; ўл§лўҐ дг­ЄжЁо ¤ҐбвагЄв®а, ®ЇаҐ¤Ґ«Ґ­­го Ї®«м§®ўвҐ«Ґ

test [ebp+arg_0], 1

jz short loc_0_40109A

push esi

call ??3@YAXPAX@Z ; operator delete(void *)

add esp, 4

; ®бў®Ў®¦¤Ґ Їпвм, а­ҐҐ ўл¤Ґ«Ґ­­го ®ЎкҐЄвг

loc_0_40109A: ; CODE XREF: __destructor+Fj

mov eax, esi

pop esi

pop ebp

retn 4

__destructor endp

‹ЁбвЁ­Ј 39

::®ЎкҐЄвл ў ўв®вЁзҐбЄ®© ЇпвЁ Ё«Ё Є®Ј¤ Є®­бвагЄв®а/¤ҐбвагЄв®а Ё¤Ґ­вЁдЁжЁа®ўвм ­Ґў®§®¦­®. …б«Ё ®ЎкҐЄв ৥йҐвбп ў б⥪Ґ (ўв®вЁзҐбЄ®© ЇпвЁ), в® ­ЁЄЄЁе Їа®ўҐа®Є гбЇҐи­®бвЁ ҐҐ ўл¤Ґ«Ґ­Ёп ­Ґ ўлЇ®«­пҐвбп Ё ўл§®ў Є®­бвагЄв®а бв­®ўЁвбп ­Ґ®в«ЁзЁ ®в ўл§®ў ®бв«м­ле дг­ЄжЁ©. Ђ­«®ЈЁз­п бЁвгжЁп Ё б ¤ҐбвагЄв®а® – б⥪®ўп Їпвм ўв®вЁзҐбЄЁ ®бў®Ў®¦¤Ґвбп Ї® §ўҐа襭Ёо дг­ЄжЁЁ, ўҐбвҐ б ­Ґ© гЁаҐв Ё б ®ЎкҐЄв ЎҐ§® ўбпЄ®Ј® ўл§®ў delete (delete ЇаЁҐ­пҐвбп в®«мЄ® ¤«п 㤫Ґ­Ёп ®ЎкҐЄв®ў Ё§ ЄгзЁ).

—в®Ўл гЎҐ¤Ёвмбп ў нв®, ®¤ЁдЁжЁа㥠дг­ЄжЁо main ­иҐЈ® ЇаҐ¤л¤г饣® ЇаЁҐа б«Ґ¤гойЁ ®Ўа§®:

main()

{

MyClass zzz;

zzz.demo();

}

‹ЁбвЁ­Ј 40

ђҐ§г«мвв Є®ЇЁ«пжЁЁ ў ®ЎйҐ б«гзҐ ¤®«¦Ґ­ ўлЈ«п¤Ґвм вЄ:

main proc near ; CODE XREF: start+AFp

var_4 = byte ptr -4

; «®Є«м­п ЇҐаҐҐ­­п zzz – нЄ§ҐЇ«па ®ЎкҐЄв MyClass

push ebp

mov ebp, esp

push ecx

lea ecx, [ebp+var_4]

; Ї®¤Ј®вў«ЁўҐ 㪧⥫м this

call constructor

; ўл§лўҐ Є®­бвагЄв®а, ЄЄ Ё ®Ўлз­го дг­ЄжЁо!

; ¤®«Јвмбп, зв® нв® Є®­бвагЄв®а ®¦­® а§ўҐ зв® Ї® ҐЈ® ᮤҐа¦Ё®г

; (®Ўлз­® Є®­бвагЄв®а Ё­ЁжЁ«Ё§ЁагҐв ®ЎкҐЄв), ¤ Ё в® ­ҐгўҐаҐ­­®

lea ecx, [ebp+var_4]

call demo

; ўл§лўҐ дг­ЄжЁо demo, - ®ЎавЁвҐ ў­Ё­ЁҐ, ҐҐ ўл§®ў ­ЁзҐ ­Ґ ®в«ЁзҐвбп

; ®в ўл§®ў Є®­бвагЄв®а!

lea ecx, [ebp+var_4]

call destructor

; ўл§лўҐ ¤ҐбвагЄв®а – ҐЈ® ўл§®ў, ЄЄ л 㦥 Ї®­п«Ё, ­ЁзҐ

; еаЄвҐа­л ­Ґ ®вҐзҐ­

mov esp, ebp

pop ebp

retn

main endp

‹ЁбвЁ­Ј 41

::Ё¤Ґ­вЁдЁЄжЁп Є®­бвагЄв®а/¤ҐбвагЄв®а ў Ј«®Ў«м­ле ®ЎкҐЄве. ѓ«®Ў«м­лҐ ®ЎкҐЄвл (вЄ ¦Ґ ­§лўҐлҐ бввЁзҐбЄЁЁ ®ЎкҐЄвЁ) ৥иовбп ў ᥣҐ­вҐ ¤­­ле ҐйҐ ­ бв¤ЁЁ Є®ЇЁ«пжЁЁ. ‘в«® Ўлвм, ®иЁЎЄЁ ўл¤Ґ«Ґ­Ёп ЇпвЁ ў ЇаЁ­жЁЇҐ ­Ґў®§®¦­л Ё, ўл室Ёв, зв® Ї® ­«®ЈЁЁ б® б⥪®ўлЁ ®ЎкҐЄвЁ, ­¤Ґ¦­® Ё¤Ґ­вЁдЁжЁа®ўвм Є®­бвагЄв®а/¤ҐбвагЄв®а Ё §¤Ґбм ­Ґ«м§п? Ђ ў®в Ё ­Ґв!

ѓ«®Ў«м­л© ®ЎкҐЄв, ў бЁ«г бў®© Ј«®Ў«м­®бвЁ, ¤®бвгЇҐ­ Ё§ ­®ЈЁе Ґбв Їа®Јал, ­® ҐЈ® Є®­бвагЄв®а ¤®«¦Ґ­ ўл§лўвмбп «Ёим ®¤­¦¤л. ЉЄ ®¦­® нв® ®ЎҐбЇҐзЁвм? Љ®­Ґз­®, ў®§®¦­л блҐ а§«Ёз­лҐ ўаЁ­вл ५Ё§жЁЁ, ­® Ў®«миЁ­бвў® Є®ЇЁ«пв®а®ў Ё¤гв Ї® Їа®б⥩иҐг ЇгвЁ, ЁбЇ®«м§гп ¤«п нв®© 楫Ё Ј«®Ў«м­го ЇҐаҐҐ­­го-д«Ј, Ё§­з«м­® аў­го ­г«о, ЇҐаҐ¤ ЇҐаўл ўл§®ў® Є®­бвагЄв®а 㢥«ЁзЁўойгобп ­ Ґ¤Ё­Ёжг (ў Ў®«ҐҐ ®ЎйҐ б«гзҐ гбв­ў«Ёўойгобп ў TRUE). ЏаЁ Ї®ўв®а­ле ЁвҐажЁпе ®бвҐвбп Їа®ўҐаЁвм – ࢥ­ «Ё д«Ј ­г«о, Ё Ґб«Ё ­Ґв – Їа®ЇгбвЁвм ўл§®ў Є®­бвагЄв®а. ’ЄЁ ®Ўа§®, Є®­бвагЄв®а ў­®ўм "®Є®«м殢뢥вбп" гб«®ў­л ЇҐаҐе®¤®, зв® Ї®§ў®«пҐв ҐЈ® ЎҐ§®иЁЎ®з­® ®в«ЁзЁвм ®в® ўбҐе ®бв«м­ле дг­ЄжЁ©.

‘ ¤ҐбвагЄв®а® ҐйҐ Їа®йҐ – а§ ®ЎкҐЄв Ј«®Ў«м­л©, в® ®­ г­Ёз⮦Ґвбп в®«мЄ® ЇаЁ §ўҐа襭ЁЁ Їа®Јал. Ђ Єв® нв® ®¦Ґв ®вб«Ґ¤Ёвм Єа®Ґ Ї®¤¤Ґа¦ЄЁ ўаҐҐ­Ё ЁбЇ®«­Ґ­Ёп? ‘ЇҐжЁ«м­п дг­ЄжЁп, вЄп ЄЄ _atexit, ЇаЁ­ЁҐв ­ ўе®¤ гЄ§вҐ«м ­ Є®­бвагЄв®а, §Ї®Ё­Ґв ҐЈ® Ё §вҐ ўл§лўҐв ЇаЁ ў®§­ЁЄ­®ўҐ­ЁЁ ў нв® ­Ґ®Ўе®¤Ё®бвЁ. €­вҐаҐб­л© ®Ґ­в - _atexit (Ё«Ё зв® в ЁбЇ®«м§гҐвбп ў ўиҐ Є®­ЄаҐв­® б«гзҐ) ¤®«¦­ Ўлвм ўл§ў­ «Ёим ®¤­®Єав­® (­¤Ґобм, Ї®­пв­® Ї®зҐг?). €, зв®Ўл ­Ґ ўў®¤Ёвм ҐйҐ ®¤Ё­ д«Ј, ®­ ўл§лўҐвбп ба§г ¦Ґ Ї®б«Ґ ўл§®ў Є®­бвагЄв®а! Ќ ЇҐаўл© ў§Ј«п¤ ®ЎкҐЄв ®¦Ґв Ї®Є§вмбп б®бв®пйЁ Ё§ ®¤­Ёе Є®­бвагЄв®а/¤ҐбвагЄв®а, ­® нв® ­Ґ вЄ! ЌҐ §Ўлў©вҐ, зв® _atexit ­Ґ ЇҐаҐ¤Ґв ­ҐҐ¤«Ґ­­® гЇаў«Ґ­ЁҐ ­ Є®¤ ¤ҐбвагЄв®а, в®«мЄ® §Ї®Ё­Ґв ҐЈ® гЄ§вҐ«м ¤«п ¤«м­Ґ©иҐЈ® ЁбЇ®«м§®ў­Ёп!

’ЄЁ ®Ўа§®, Є®­бвагЄв®а/¤ҐбвагЄв®а Ј«®Ў«м­®Ј® ®ЎкҐЄв ®зҐ­м Їа®бв® Ё¤Ґ­вЁдЁжЁа®ўвм, зв® Ё ¤®Є§лўҐв б«Ґ¤гойЁ© ЇаЁҐа:

main()

{

staticMyClass zzz;

zzz.demo();

}

‹ЁбвЁ­Ј 42

ђҐ§г«мвв ҐЈ® Є®ЇЁ«пжЁЁ ў ®ЎйҐ б«гзҐ ¤®«¦Ґ­ ўлЈ«п¤Ґвм вЄ:

main proc near ; CODE XREF: start+AFp

mov cl, byte_0_4078E0 ; д«Ј Ё­ЁжЁ«Ё§жЁЁ нЄ§ҐЇ«па ®ЎкҐЄв

mov al, 1

test al, cl

; ®ЎкҐЄв Ё­ЁжЁ«Ё§Ёа®ў­?

jnz short loc_0_40106D

; --> ¤, Ё­ЁжЁ«Ё§Ёа®ў­, - ­Ґ ўл§лўҐ Є®­бвагЄв®а

mov dl, cl

mov ecx, offset unk_0_4078E1 ; нЄ§Ґ«па ®ЎкҐЄв

; Ј®в®ўЁ 㪧⥫м this

or dl, al

; гбв­ў«ЁўҐ д«Ј Ё­ЁжЁ«Ё§жЁЁ ў TRUE

; Ё ўл§лўҐ Є®­бвагЄв®а

mov byte_0_4078E0, dl ; д«Ј Ё­ЁжЁ«Ё§жЁЁ нЄ§ҐЇ«па ®ЎкҐЄв

call constructor

; ‚맮ў Є®­бвагЄв®а.

; ЋЎавЁвҐ ў­Ё­ЁҐ, зв® Ґб«Ё нЄ§ҐЇ«па ®ЎкҐЄв 㦥 Ё­ЁжЁ«Ё§Ёа®ў­

; (б. Їа®ўҐаЄг ўлиҐ) Є®­бвагЄв®а ­Ґ ўл§лўҐвбп.

; ’ЄЁ ®Ўа§®, ҐЈ® ®зҐ­м «ҐЈЄ® ®в®¦¤ҐбвўЁвм!

push offset thunk_destructo

call _atexit

add esp, 4

; ЏҐаҐ¤Ґ дг­ЄжЁЁ _atexit гЄ§вҐ«м ­ ¤ҐбвагЄв®а,

; Є®в®ал© ®­ ¤®«¦­ ўл§ўвм Ї® §ўҐа襭ЁЁ Їа®Јал

loc_0_40106D: ; CODE XREF: main+Aj

mov ecx, offset unk_0_4078E1 ; нЄ§ҐЇ«па ®ЎкҐЄв

; Ј®в®ўЁ 㪧⥫м this

jmp demo

; ўл§лўҐ demo

main endp

thunk_destructo: ; DATA XREF: main+20o

; ЇҐаҐе®¤­ЁЄ Є дг­ЄжЁЁ-¤ҐбвагЄв®аг

mov ecx, offset unk_0_4078E1 ; нЄ§ҐЇ«па ®ЎкҐЄв

jmp destructor

byte_0_4078E0 db 0 ; DATA XREF: mainr main+15w

; д«Ј Ё­ЁжЁ«Ё§жЁЁ нЄ§ҐЇ«па ®ЎкҐЄв

unk_0_4078E1 db 0 ; ; DATA XREF: main+Eo main+2Do ...

; нЄ§ҐЇ«па ®ЎкҐЄв

‹ЁбвЁ­Ј 43

Ђ­«®ЈЁз­л© Є®¤ ЈҐ­ҐаЁагҐв Ё Borland C++. …¤Ё­б⢥­­®Ґ ®в«ЁзЁҐ – Ў®«ҐҐ еЁвал© ўл§®ў ¤ҐбвагЄв®а. ‚맮ўл ўбҐе ¤ҐбвагЄв®а®ў Ї®ҐйҐ­л ў бЇҐжЁ«м­го Їа®жҐ¤гаг, Є®в®ап ўл¤Ґв ᥡп вҐ, зв® ®Ўлз­® абЇ®«ЈҐвбп ЇҐаҐ¤ ЎЁЎ«Ё®вҐз­лЁ дг­ЄжЁпЁ (Ё«Ё ў ­ҐЇ®б।б⢥­­®© Ў«Ё§®бвЁ ®в ­Ёе), вЄ зв® Ё¤Ґ­вЁдЁжЁа®ўвм ҐҐ ®зҐ­м «ҐЈЄ®. ‘®ваЁвҐ бЁ:

_main proc near ; DATA XREF: DATA:00407044o

push ebp

mov ebp, esp

cmp ds:byte_0_407074, 0 ; д«Ј Ё­ЁжЁ«Ё§жЁЁ ®ЎкҐЄв

jnz short loc_0_4010EC

; …б«Ё ®ЎкҐЄв 㦥 Ё­ЁжЁ«Ё§Ёа®ў­ – Є®­бвагЄв®а ­Ґ ўл§лўҐвбп

mov eax, offset unk_0_4080B4 ; ќЄ§ҐЇ«па ®ЎкҐЄв

call constructor

inc ds:byte_0_407074 ; д«Ј Ё­ЁжЁ«Ё§жЁЁ ®ЎкҐЄв

; “ўҐ«ЁзЁўҐ д«Ј ­ Ґ¤Ё­Ёжг, ў®§ў®¤п ҐЈ® ў TRUE

loc_0_4010EC: ; CODE XREF: _main+Aj

mov eax, offset unk_0_4080B4 ; ќЄ§Ґ«па ®ЎкҐЄв

call demo

; ‚맮ў дг­ЄжЁЁ demo

xor eax, eax

pop ebp

retn

_main endp

call_destruct proc near ; DATA XREF: DATA:004080A4o

; ќв дг­ЄжЁп ᮤҐа¦Ёв ў ᥡҐ ўл§®ўл ўбҐе ¤ҐбвагЄв®а®ў Ј«®Ў«м­ле ®ЎкҐЄв®ў,

; Ї®бЄ®«мЄг, ўл§®ў Є¦¤®Ј® ¤ҐбвагЄв®а "®Є®«мж®ў­" Їа®ўҐаЄ®© д«Ј Ё­ЁжЁ«Ё§жЁЁ,

; нвг дг­ЄжЁо «ҐЈЄ® Ё¤Ґ­вЁдЁжЁа®ўвм – в®«мЄ® ®­ ᮤҐа¦Ёв Ї®¤®Ў­л© "Є«Ґз­л© Є®¤"

; (ўл§®ўл Є®­бвагЄв®а®ў ®Ўлз­® а§Ўа®б­л Ї® ўбҐ© Їа®ЈаҐ)

push ebp

mov ebp, esp

cmp ds:byte_0_407074, 0 ; д«Ј Ё­ЁжЁ«Ё§жЁЁ ®ЎкҐЄв

jz short loc_0_401117

; ®ЎкҐЄв Ўл« Ё­ЁжЁ«Ё§Ёа®ў­?

mov eax, offset unk_0_4080B4 ; ќЄ§ҐЇ«па ®ЎкҐЄв

; Ј®в®ўЁ 㪧⥫м this

mov edx, 2

call destructor

; ўл§лўҐ ¤ҐбвагЄв®а

loc_0_401117: ; CODE XREF: call_destruct+Aj

pop ebp

retn

call_destruct endp

‹ЁбвЁ­Ј 44

:: ўЁавг«м­л© ¤ҐбвагЄв®а. „ҐбвагЄв®а ⮦Ґ ®¦Ґв Ўлвм ўЁавг«м­л! Ђ Ї®зҐг Ўл Ё ­Ґв? ќв® ЎлўҐв Ї®«Ґ§­®, Є®Ј¤ нЄ§ҐЇ«па Їа®Ё§ў®¤­®Ј® Є«бб 㤫пҐвбп зҐаҐ§ гЄ§вҐ«м ­ Ў§®ўл© ®ЎкҐЄв. Џ®бЄ®«мЄг, ўЁавг«м­лҐ дг­ЄжЁЁ бўп§­л б Є«бб® ®ЎкҐЄв, ­Ґ б Є«бᮠ㪧⥫п, в® ўл§лўҐвбп ўЁавг«м­л© ¤ҐбвагЄв®а, бўп§­­л© б вЁЇ® ®ЎкҐЄв, ­Ґ б вЁЇ® 㪧⥫п. ‚Їа®зҐ, нвЁ в®­Є®бвЁ ®в­®бпвбп Є ­ҐЇ®б।б⢥­­®г Їа®ЈаЁа®ў­Ёо, Ёбб«Ґ¤®ўвҐ«Ґ© ў ЇҐаўго ®зҐаҐ¤м Ё­вҐаҐбгҐв: ЄЄ Ё¤Ґ­вЁдЁжЁа®ўвм ўЁавг«м­л© ¤ҐбвагЄв®а. Ћ, нв® Їа®бв® – ўЁавг«м­л© ¤ҐбвагЄв®а б®ўҐйҐв ў ᥡҐ бў®©бвў ®Ўлз­®Ј® ¤ҐбвагЄв®а Ё ўЁавг«м­®© дг­ЄжЁЁ (б. "€¤Ґ­вЁдЁЄжЁп ўЁавг«м­ле дг­ЄжЁ©").

::ўЁавг«м­л© Є®­бвагЄв®а. ‚Ёавг«м­л© Є®­бвагЄв®а?! Ђ зв®, а§ўҐ Ґбвм вЄ®©? ЌЁзҐЈ® Ї®¤®Ў­®Ј® бв­¤ав­л© ‘Ё++ ­Ґ Ї®¤¤Ґа¦ЁўҐв. ЌҐЇ®б।б⢥­­® ­Ґ Ї®¤¤Ґа¦ЁўҐв. €, Є®Ј¤ ўЁавг«м­л© Є®­бвагЄв®а Ї®§аҐ§ вॡгҐвбп Їа®ЈаЁбв® (ўЇа®зҐ, ЎлўҐв нв® «Ёим ў ўҐбм нЄ§®вЁзҐбЄЁе б«гзпе), ®­Ё ЇаЁЎҐЈов Є агз­®© нг«пжЁЁ ­ҐЄ®в®а®Ј® ҐЈ® Ї®¤®ЎЁп. ‚ бЇҐжЁ«м­® ўл¤Ґ«Ґ­­го ¤«п нвЁе 楫Ґ© ўЁавг«м­го дг­ЄжЁо (­Ґ Є®­бвагЄв®а!) Ї®ҐйҐвбп ЇаЁЎ«Ё§ЁвҐ«м­® б«Ґ¤гойЁ© Є®¤: "return new Ёп Є«бб (*this)" Ё«Ё "return new Ёп Є«бб (*this)". ќв®в ваоЄ ЄаЁўҐҐ, зҐ ЎгҐа­Ј, ­®… ®­ аЎ®вҐв. ђ§гҐҐвбп, бгйҐбвўгов Ё ¤агЈЁҐ аҐиҐ­Ёп.

Џ®¤а®Ў­®Ґ Ёе ®Ўб㦤Ґ­ЁҐ ¤«ҐЄ® ўл室Ёв § аЄЁ ¤­­®© Є­ЁЈЁ Ё вॡгҐв Ј«гЎ®Є® §­­Ёп ‘Ё++ (Ј®а§¤® Ў®«ҐҐ Ј«гЎ®Є®Ј®, зҐ г а冷ў®Ј® а§аЎ®взЁЄ), Є в®г ¦Ґ нв® §­п«® Ўл б«ЁиЄ® ­®Ј® Ґбв… ­® Ґ¤ў «Ё ®Є§«®бм Ё­вҐаҐб­® а冷ў®г зЁв⥫о.

€вЄ, Ё¤Ґ­вЁдЁЄжЁп ўЁавг«м­®Ј® Є®­бвагЄв®а ў бЁ«г ®вбгвбвўЁп б®Ј® Ї®­пвЁп – ў ЇаЁ­жЁЇҐ ­Ґў®§®¦­. …Ј® нг«пжЁп ­бзЁв뢥⠤ҐбпвЄЁ аҐиҐ­Ё© (Ґб«Ё ­Ґ Ў®«миҐ), – Ї®Їа®Ўг©-Є, ЇҐаҐзЁб«Ё Ёе ўбҐ! ‚Їа®зҐ, нв®Ј® Ё ­Ґ ­г¦­® ¤Ґ«вм – ў Ў®«миЁ­б⢥ б«г祢 ўЁавг«м­лҐ Є®­бвагЄв®ал ЇаҐ¤бвў«пов б®Ў®© ўЁавг«м­лҐ дг­ЄжЁЁ, ЇаЁ­ЁойЁҐ ў ЄзҐб⢥ аЈгҐ­в 㪧⥫м this Ё ў®§ўайойЁҐ гЄ§вҐ«м ­ ­®ўл© ®ЎкҐЄв. ЌҐ б«ЁиЄ®-в® ­¤Ґ¦­® ¤«п Ё¤Ґ­вЁдЁЄжЁЁ, ­® ўбҐ ¦Ґ «гзиҐ, зҐ ­ЁзҐЈ®.

::Є®­бвагЄв®а а§, Є®­бвагЄв®а ¤ў… Љ®«ЁзҐбвў® Є®­бвагЄв®а®ў ®ЎкҐЄв ®¦Ґв Ўлвм Ё Ў®«ҐҐ ®¤­®Ј® (Ё ®зҐ­м збв® ­Ґ в®«мЄ® ®¦Ґв, ­® Ё ЎлўҐв). Ћ¤­Є® нв® ­ЁЄЄ ­Ґ ў«ЁпҐв ­ ­«Ё§. ‘Є®«мЄ® Ўл Є®­бвагЄв®а®ў ­Ё ЇаЁбгвбвў®ў«®, – ¤«п Є¦¤®Ј® нЄ§ҐЇ«па ®ЎкҐЄв ўбҐЈ¤ ўл§лўҐвбп в®«мЄ® ®¤Ё­, ўлЎа­­л© Є®ЇЁ«пв®а® ў §ўЁбЁ®бвЁ ®в д®ал ®Ўкпў«Ґ­Ёп ®ЎкҐЄв. …¤Ё­б⢥­­п ¤Ґв«м – ৫Ёз­лҐ нЄ§ҐЇ«пал ®ЎкҐЄв ®Јгв ўл§лўвм ৫Ёз­лҐ Є®­бвагЄв®ал – Ўг¤м⥠ў­ЁвҐ«м­л!

:: §зҐ Є®§Ґ Ўп­ Ё«Ё ў­Ё­ЁҐ: Їгбв®© Є®­бвагЄв®а. ЌҐЄ®в®алҐ ®Ја­ЁзҐ­Ёп Є®­бвагЄв®а (ў збв­®бвЁ, ®вбгвбвўЁҐ ў®§ўа饮Ј® §­зҐ­Ёп) ЇаЁўҐ«Ё Є Ї®пў«Ґ­Ёо бвЁ«п Їа®ЈаЁа®ў­Ёп "Їгбв®© Є®­бвагЄв®а". Љ®­бвагЄв®а гли«Ґ­­® ®бвў«пҐвбп Їгбвл, ўҐбм Є®¤ Ё­ЁжЁ«Ё§жЁЁ Ї®ҐйҐвбп ў бЇҐжЁ«м­го дг­ЄжЁо-з«Ґ­, ЄЄ ЇаўЁ«®, ­§лўҐго Init. ЋЎб㦤Ґ­ЁҐ бЁ«м­ле Ё б«Ўле бв®а®­ вЄ®Ј® бвЁ«п – ЇаҐ¤Ґв ®в¤Ґ«м­®Ј® а§Ј®ў®а, ­ЁЄЄЁ Ў®Є® ­Ґ ®в­®бп饣®бп Є ¤­­®© Є­ЁЈҐ. €бб«Ґ¤®ўвҐ«п ¤®бвв®з­® §­вм – вЄ®© бвЁ«м Ґбвм Ё ЄвЁў­® ЁбЇ®«м§гҐвбп ­Ґ в®«мЄ® ®в¤Ґ«м­лЁ Ё­¤ЁўЁ¤г«м­лЁ Їа®ЈаЁбвЁ, ­® Ё ЄагЇ­Ґ©иЁЁ Є®Ї­ЁпЁ-ЈЁЈ­вЁ (­ЇаЁҐа, в®© ¦Ґ Microsoft). Џ®нв®г, ўбваҐвЁў ўл§®ў Їгбв®Ј® Є®­бвагЄв®а, – ­Ґ г¤Ёў«п©вҐбм, - нв® ­®а«м­®, Ё ЁйЁвҐ дг­ЄжЁо Ё­ЁжЁ«Ё§жЁЁ б।Ё ®Ўлз­ле з«Ґ­®ў.


3487622416521463.html
3487698094632361.html
    PR.RU™