Distrugatorul virtual - suprapunerea stivei în limba rusă

A fost o întrebare despre distrugătorul virtual.

Așa cum am înțeles - un destructor virtual este necesar să moștenească o clasă în care avem (de la bază) ar putea provoca o (direct din) destructor a bazei, precum și simplu clasa destructor moștenită nu înțelege, atunci ai nevoie pentru a crea unul virtual.







Și toate acestea, astfel încât să nu existe scurgeri de memorie.

Am înțeles punctul?

Nu, puțin greșit. Distrugătorul clasei de bază de la distrugătorul derivatului nu ar trebui să fie chemat (și este imposibil), acesta va fi numit automat. Problema este diferită: distrugătorul unei clase derivate nu poate fi numit!

Imaginați-vă această situație:

Ce se întâmplă dacă există un Spion în listă. Iată ce: atunci când distrugeți un obiect de tip Spy printr-un pointer de tip Person *, un distrugător non-virtual

Persoana. Prin urmare, memoria pentru matricea gadgeturilor nu va fi eliberată. Aici este o scurgere de memorie.







De fapt, orice alte probleme, deoarece destructor poate avea loc în plus față de scurgere de memorie, care era de așteptat, nu suna! De exemplu, fișierul nu poate fi închis, iar data viitoare când încercați să deschideți programul va decola. Sau nu a lansat mutex, și dacă încercați să obțineți programul hang. Ei bine și încă o grămadă de accidente poate apărea.

Pentru a face lucrurile si mai rele, lipsa de destructor virtuale standard, în acest caz, este un comportament nedefinit, adică, programul este permis să facă orice: pentru a formata hard disk, o declarație de dragoste pentru chimist prin intermediul „Vkontakte“ sau valeriana se toarnă într-un castron de Whiskas.

Da, dar nu există deloc C distrugători.

Voi adăuga următorul cod la o explicație foarte bună a utilizatorului VladD, care se găsește adesea peste tot:

Rezultatul va fi:

Fiți atenți la ordinea apelurilor adresate constructorilor și distrugătorilor. Distructorii sunt invocați în ordine inversă a apelurilor constructorului. Acum eliminați cuvântul cheie virtuală de la

Derive (). ca o consecință, distrugătorul clasei Derive nu va fi numit:

Dacă intenționați să moșteniți din clasa de bază, ceilalți distrugători de clasă ar trebui să fie virtuali. Vă recomand să citiți Scott Meyers, el are cărți excelente despre C ++.







Articole similare

Trimiteți-le prietenilor: