Acasă Finanțe personale Cum Heap Works în C ++ - dummies

Cum Heap Works în C ++ - dummies

Cuprins:

Video: ? Ce este un Queue si cum Functioneaza in Procesarea Datelor | Structuri de Date si Algoritmi #4 2024

Video: ? Ce este un Queue si cum Functioneaza in Procesarea Datelor | Structuri de Date si Algoritmi #4 2024
Anonim

Mormântul este un bloc amorf de memorie pe care programul C ++ îl poate accesa după cum este necesar. Aflați de ce există și cum se utilizează.

La fel cum este posibil să treci un pointer la o funcție, este posibil ca o funcție să returneze un pointer. O funcție care returnează adresa unui dublu este declarată după cum urmează:

double * fn (void);

Cu toate acestea, trebuie să fii foarte atent atunci când întorci un pointer. Pentru a înțelege pericolele, trebuie să știți ceva despre domeniul de aplicare variabil.

Domeniu limitat în C ++

Domeniul de aplicare este domeniul în care este definită o variabilă. Luați în considerare următorul fragment de cod:

// următoarea variabilă este accesibilă pentru // toate funcțiile și definită atâta timp cât // se execută (domeniul global) int intGlobal; // următoarea variabilă intChild este accesibilă // numai funcției și este definită doar // atâta timp cât C ++ execută funcția child () sau a // funcția pe care apelurile child () (scopul funcției) void child (void) {int intChild;} // urmatoarea variabila intParent are functia // scop void parent (void) {int intParent = 0; copil(); int intLater = 0; (int nArgs, char * pArgs []) {parent ();}

Acest fragment de program începe cu declararea unei variabile intGlobal. Această variabilă există odată cu începerea execuției programului până la terminarea acestuia. Spui că intGlobal are o acoperire de program. "De asemenea, spuneți că variabila" intră în domeniul de aplicare "chiar înainte ca funcția principal () să fie apelată.

Funcția main () invocă imediat părinte (). Primul lucru pe care procesorul îl vede în parinte () este declarația intParent. În acel moment, intParent merge în domeniul de aplicare - adică, intParent este definit și disponibil pentru restul funcției parent ().

A doua instrucțiune în parent () este apelul la copil (). Încă o dată, funcția child () declară o variabilă locală, de data aceasta intChild. Domeniul variabilei intChild este limitat la funcția child (). Din punct de vedere tehnic, intParent nu este definit în domeniul copilului (), deoarece copilul () nu are acces la intParent; cu toate acestea, variabila intParent continuă să existe în timp ce copilul () este executat.

Atunci când copilul () iese, variabila intChild iese din domeniul de aplicare. Nu numai că intChild nu mai este accesibil, ci nu mai există. (Memoria ocupată de intChild este returnată la fondul general pentru a fi folosită pentru alte lucruri.)

Ca mama () continuă să se execute, variabila intLater intră în domeniul de aplicare la declarație. În punctul în care părintele () revine la main (), atât intParent, cât și intLater ies din domeniul de aplicare.

Deoarece intGlobal este declarat global în acest exemplu, este disponibil pentru toate cele trei funcții și rămâne disponibil pentru durata de viață a programului.

Examinarea problemei de domeniu în C ++

Următorul segment de cod se compilează fără eroare, dar nu funcționează (nu urâți că?):

double * child (void) {double dLocalVariable; retur & dLocalVariable;} void părinte (void) {double * pdLocal; pdLocal = copil (); * pdLocal = 1. 0;}

Problema cu această funcție este că dLocalVariable este definită numai în cadrul funcției child (). Astfel, odată ce adresa de memorie a dLocalVariable este returnată de la copil (), se referă la o variabilă care nu mai există. Memoria pe care dLocalVariable a ocupat-o anterior este probabil utilizată pentru altceva.

Această eroare este foarte frecventă, deoarece poate fi târâtă în mai multe moduri. Din păcate, această eroare nu provoacă oprirea instantanee a programului. De fapt, programul poate funcționa bine în majoritatea timpului - adică programul continuă să funcționeze atâta timp cât memoria ocupată anterior de dLocalVariable nu este reutilizată imediat. Asemenea probleme intermitente sunt cele mai dificile pentru rezolvare.

Furnizarea unei soluții folosind halda în C ++

Problema de domeniu a apărut deoarece C ++ a preluat memoria definită local înainte ca programatorul să fie gata. Este nevoie de un bloc de memorie controlat de programator. Poate să aloce memoria și să o pună înapoi atunci când dorește - nu pentru că C ++ crede că este o idee bună. Un astfel de bloc de memorie este numit heap.

Memoria de heap este alocată utilizând noul cuvânt cheie urmat de tipul de obiect pe care îl alocați. Noua comandă rupe o bucată de memorie din gramada suficient de mare pentru a ține tipul de obiect specificat și returnează adresa. De exemplu, următoarele alocă o variabilă dublă din halda:

dublu * copil (void) {double * pdLocalVariable = nou dublu; returnați pdLocalVariable;}

Această funcție funcționează acum corect. Deși variabila pdLocalVariable iese din domeniul de aplicare atunci când funcția child () revine, memoria la care se referă pdLocalVariable nu face. O locație de memorie returnată de noi nu iese din domeniul de aplicare până când nu este returnată în mod explicit la heap folosind ștergerea cuvintelor cheie, care este proiectată special pentru acest scop:

void parent (void) {// child () returnează adresa a unui bloc // de memorie heap dublă * pdMyDouble = copil (); // stocați o valoare acolo * pdMyDouble = 1. 1; // … // returnează acum memoria la ștergerea heapului pdMyDouble; pdMyDouble = 0; // …}

Aici pointerul returnat de copil () este folosit pentru a stoca o valoare dubla. După ce funcția este terminată cu locația de memorie, aceasta este returnată la heap. Funcția parent () stabilește pointerul la 0 după ce memoria heap a fost returnată - aceasta nu este o cerință, dar este o idee foarte bună.

Dacă programatorul încearcă în mod greșit să stocheze ceva în * pdMyDouble după ștergere, programul se va prăbuși imediat cu un mesaj de eroare semnificativ.

Puteți folosi noi pentru a aloca și ele matrice din heap, dar trebuie să returnați un matrice utilizând cuvântul cheie de ștergere:

int * nArray = new int [10]; nArray [0] = 0; ștergeți [] nArray;

Tehnic nou int [10] invocă noul operator [], dar funcționează la fel ca și noul.

Cum Heap Works în C ++ - dummies

Alegerea editorilor

Evaluarea Vizualizărilor de date - dummies

Evaluarea Vizualizărilor de date - dummies

Vizualizările de date pot fi foarte colorate și impresionante. Dar amintiți-vă că cheia pentru crearea unor vizualizări eficiente de date nu depinde de faptul dacă este interesantă, ci mai degrabă de faptul dacă descoperă problemele reale de afaceri care trebuie abordate. O foaie de lucru vă ajută să creați propriile vizualizări de date sau să evaluați creațiile altora. Aici ...

Determinarea programului care funcționează cel mai bine pentru nevoile tale informatice

Determinarea programului care funcționează cel mai bine pentru nevoile tale informatice

Să lucreze mai bine decât celălalt. În timp, veți dezvolta un sentiment dacă Illustrator sau Photoshop se potrivesc mai bine pentru diverse sarcini. Până atunci, iată un exemplu despre modul în care fiecare program gestionează diferite elemente ale lucrării de design grafic. Graphing Photoshop nu este un program de grafic. Tu ...

Infografice nevergreen: Închirierea obiectelor Build - dummies

Infografice nevergreen: Închirierea obiectelor Build - dummies

Infografics evergreen nu sunt legate de niciun eveniment sau persoană în știri . Ele nu au o componentă sezonieră și nu sunt legate de ceva în timp util. O infographic despre cum se fac CD-urile se va aplica pentru că este vorba de muzică, dar nu este specifică nici unui artist sau gen. Cu infografiile veșnic verzi, ignorați complet evenimentele curente și explorați ideile ...

Alegerea editorilor

Utilizați Zoom în Adobe Photoshop CS5 - manechine

Utilizați Zoom în Adobe Photoshop CS5 - manechine

Adobe Creative Suite 5 oferă scurtături pentru Zooming în Photoshop. Imaginile care arată bine la un nivel de zoom pot părea extrem de proaste la altul. Veți mări și micșora destul de des în timp ce lucrați la imagini în Photoshop. Puteți găsi opțiuni de meniu pentru zoom în meniul Vizualizare; o modalitate mai rapidă de a mări este ...

Text în Photoshop CC - dummies

Text în Photoshop CC - dummies

Când editați o imagine cu text în Photoshop CC, puteți schimba linia care fluxul dvs. de tip fie folosind funcția Warp Text sau tastând pe o cale. Tipul de deformare utilizează forme predefinite la care se formează tipul dvs. (și poate fi utilizat atât cu tipul de punct, cât și cu paragraful) și tastând ...

Alegerea editorilor

Cum se adaugă Biblioteca RegEx în C ++ - dummies

Cum se adaugă Biblioteca RegEx în C ++ - dummies

Cea mai mare parte a bibliotecii Boost funcționează bine adăugând la codul aplicației. Cu toate acestea, câteva componente, cum ar fi RegEx, necesită o bibliotecă. Înainte de a putea folosi o bibliotecă, trebuie să o construiți. După ce ați construit biblioteca, trebuie să o adăugați în aplicație. Există două tehnici de adăugare a ...

Cum Heap Works în C ++ - dummies

Cum Heap Works în C ++ - dummies

Halda este un bloc amorf de memorie pe care programul C ++ îl poate accesa după cum este necesar. Aflați de ce există și cum se utilizează. Așa cum este posibil să treci un pointer la o funcție, este posibil ca o funcție să returneze un pointer. O funcție care returnează adresa ...

Cum să evitați codul de injectare în C ++ - dummies

Cum să evitați codul de injectare în C ++ - dummies

Prima regulă de evitare a codului injectat în programele C ++ , permiterea prelucrării datelor de către un interpret de limbă cu scop general. O eroare obișnuită cu SQL-injectarea este că programul acceptă intrarea utilizatorului ca și cum ar fi fost întotdeauna acceptabilă și îl inserează într-o interogare SQL pe care o trimite apoi la ...