De unde șterge operatorul învață câți octeți ar trebui să fie eliberați - depășirea stivei în limba rusă

Ceva despre care m-am gândit că nu înțeleg un fel de lucru banal.

De unde operatorul șterge [] află că este necesar să se elibereze doar 20 de octeți de dimensiune (int)?







Ce se întâmplă ca rezultat al următorului cod:

și este corect deloc? Ieșire la consola:

Ie între zonele de memorie alocate există 64 de biți. Ultimul număr este întotdeauna uniform și cel puțin 2 mai mare decât dimensiunea primei matrice.

Un alt experiment (de mai sus a fost pe Win7 / Qt / mingw), acum Ubunto14.04 / Qt / g ++:

Ieșire la consola:

Operatorul "nou cu paranteze" stochează informații despre numărul de elemente de matrice. delete [] extrage aceste informații și apelează destructorii elementelor.







Compilatorul poate genera codul pentru acești operatori după cum urmează:

Notă1: De fapt, în loc de malloc și liber, se apelează funcțiile void * operatorul new [] (size_t bytes) și void operator delete [] (void *). Dar din moment ce ele produc ceva asemănător cu malloc / liber, apoi în contextul acestei probleme acest lucru poate fi neglijat.

Notă2: Pentru a gestiona excepțiile, compilatorul va genera un bloc de încercare pentru noua [].

Ie chiar și atunci când operatorul de ștergere [] este aplicat copiei indicatorului, operatorul dat va accesa memoria corespunzătoare (care a fost alocată simultan cu datele și la care undeva în zona de date este stocat încă un pointer, bine sau cumva) care este responsabil pentru numărul inițial alocate octeți pe un astfel de indicator, în final, să ia în considerare dimensiunea memoriei alocate inițial atunci când ștergeți? - StateItPrimitive Apr 8 '16 la 7:50 am

În privința celei de-a doua părți, nu sunt absolut sigură că nu am lucrat mult timp cu C ++, dar nu văd nici o problemă, totul pare corect:

răspunsul dat 14 decembrie '15 la 23:50







Trimiteți-le prietenilor: