Hjem Personlig finansiering Hvordan heap fungerer i C ++ - dummies

Hvordan heap fungerer i C ++ - dummies

Indholdsfortegnelse:

Video: Writing 2D Games in C using SDL by Thomas Lively 2025

Video: Writing 2D Games in C using SDL by Thomas Lively 2025
Anonim

Højen er en amorf blok af hukommelse, som dit C ++-program kan få adgang til efter behov. Lær om hvorfor det eksisterer og hvordan man bruger det.

Ligesom det er muligt at sende en peger til en funktion, er det muligt for en funktion at returnere en peger. En funktion, der returnerer adressen til en dobbelt, erklæres som følger:

dobbelt * fn (tomrum);

Du skal dog være meget forsigtig, når du vender tilbage. For at forstå farerne skal du vide noget om variabelt omfang.

Begrænset omfang i C ++

Anvendelsesområde er det område, over hvilket en variabel er defineret. Overvej følgende kodestykke:

// Følgende variabel er tilgængelig for // alle funktioner og defineret så længe // programmet kører (globalt omfang) int intGlobal; // den følgende variable intChild er tilgængelig // kun til funktionen og er kun defineret // så længe C ++ udfører barnet () eller en // -funktion hvilket barn () opkald (funktionsomfang) tomrum (tomrum) {int intChild;} // følgende variabel intParent har funktion // omfang tom forælder (tom) {int intParent = 0; barn(); int intLater = 0; intParent = intLater;} int main (int nArgs, char * pArgs []) {parent ();}

Dette programfragment begynder med erklæringen af ​​en variabel intGlobal. Denne variabel eksisterer fra det tidspunkt, hvor programmet begynder at køre, indtil det afsluttes. Du siger, at intGlobal "har programmets omfang. "Du siger også, at variablen" går i omfang ", selv før funktionen hoved () kaldes.

Funktionshovedet () aktiverer straks forældre (). Den første ting, som processoren ser i forælder () er erklæringen om intParent. På det tidspunkt går intParent ind i omfang - det vil sige intParent er defineret og tilgængeligt for resten af ​​funktionen forælder ().

Den anden erklæring i forælder () er opkaldet til barnet (). Endnu engang erklærer funktionsbarnet () en lokal variabel, denne gang intChild. Omfanget af variablen intChild er begrænset til funktionsbarnet (). Teknisk set er intParent ikke defineret inden for børns anvendelsesområde (), fordi barnet () ikke har adgang til intParent; Den variable intParent eksisterer dog fortsat, mens barnet () udføres.

Når barnet () udgår, går variablen intChild uden for anvendelsesområdet. Ikke kun er intChild ikke længere tilgængelig, det eksisterer ikke længere. (Hukommelsen optaget af intChild returneres til den generelle pool, der skal bruges til andre ting.)

Som forælder () fortsætter udførelsen, går den variable intLater ind i anvendelsesområdet ved erklæringen. På det tidspunkt, hvor forælder () vender tilbage til main (), går både intParent og intLater uden for anvendelsesområdet.

Da intGlobal er erklæret globalt i dette eksempel, er den tilgængelig for alle tre funktioner og forbliver tilgængelig for programmets levetid.

Undersøg omfangsproblemet i C ++

Følgende kodesegment kompilerer uden fejl, men virker ikke (har du ikke bare hader det?):

dobbelt * barn (tomrum) {double dLocalVariable; returnere & dLocalVariable;} void parent (void) {double * pdLocal; pdLocal = barn (); * pdLocal = 1. 0;}

Problemet med denne funktion er, at dLocalVariable kun er defineret inden for funktionsbarnets anvendelsesområde (). På den tid refereres hukommelsesadressen til dLocalVariable fra barnet () til en variabel, der ikke længere eksisterer. Den hukommelse, som dLocalVariable tidligere optog, bruges sandsynligvis til noget andet.

Denne fejl er meget almindelig, fordi den kan krybe op på en række måder. Desværre forårsager denne fejl ikke, at programmet øjeblikkeligt stopper. Faktisk kan programmet fungere fint det meste af tiden - det vil sige, at programmet fortsætter med at virke, så længe den hukommelse, der tidligere var optaget af dLocalVariable, ikke genbruges umiddelbart. Sådanne intermitterende problemer er de vanskeligste at løse.

Giver en løsning ved hjælp af bunken i C ++

Omfangsproblemet opstod, fordi C ++ tog tilbage den lokalt definerede hukommelse, før programmeringen var klar. Hvad der er brug for er en blok af hukommelse, der styres af programmøren. Hun kan allokere hukommelsen og sætte den tilbage, når hun vil - ikke fordi C ++ synes det er en god idé. En sådan blok af hukommelse hedder bunken.

Heap hukommelse er tildelt ved hjælp af det nye søgeord efterfulgt af den type objekt at allokere. Den nye kommando brækker en del hukommelse ud af bunken, der er stor nok til at holde den specificerede type objekt og returnerer adressen. For eksempel tildeler følgende en dobbeltvariabel fra bunken:

dobbelt * barn (tomrum) {double * pdLocalVariable = new double; returner pdLocalVariable;}

Denne funktion virker nu korrekt. Selv om variablen pdLocalVariable går uden for rækkevidden, når funktionsbarnet () vender tilbage, vil den hukommelse, som pdLocalVariable henviser til, ikke. En hukommelsesplacering, der returneres af ny, går ikke ud af omfanget, før den eksplicit returneres til bunken ved hjælp af søgeordets sletning, som er specielt designet til dette formål:

tom forælder (tom) {// child () returnerer adressen af en blok // af bunkehukommelse dobbelt * pdMyDouble = barn (); // gem en værdi der * pdMyDouble = 1. 1; // … // returner nu hukommelsen til bunken slet pdMyDouble; pdMyDouble = 0; // …}

Her bliver pointeren returneret af barnet () brugt til at gemme en dobbeltværdi. Når funktionen er færdig med hukommelsesstedet, returneres den til bunken. Funktionsforældre () sætter pegeren til 0, efter at hulehukommelsen er returneret - det er ikke et krav, men det er en meget god ide.

Hvis programmereren fejlagtigt forsøger at gemme noget i * pdMyDouble efter sletningen, vil programmet straks slå sammen med en meningsfuld fejlmeddelelse.

Du kan bruge ny til at tildele arrayer fra bunken også, men du skal returnere en matrix ved at slette [] nøgleordet:

int * nArray = new int [10]; nArray [0] = 0; slet [] nArray;

Teknisk ny int [10] påberåber den nye [] operatør, men det virker som det samme som nyt.

Hvordan heap fungerer i C ++ - dummies

Valg af editor

10 Transaktioner og funktioner, som de fleste oplysninger konverterer til i QuickBooks Online - dummies

10 Transaktioner og funktioner, som de fleste oplysninger konverterer til i QuickBooks Online - dummies

Følgende listen indeholder detaljer om transaktioner og funktioner, som de fleste data konverterer og sammenlignelige transaktioner og funktioner findes i QuickBooks Online (QBO). I nogle tilfælde findes undtagelser; Du finder specifikke noter i web-ekstraartikel & ldquo; Hvordan QuickBooks Desktop Lister Konverter til QuickBooks Online. & Rdquo; Og for flere oplysninger, besøg QuickBooks ofte stillede spørgsmål, og ldquo; Hvorfor ...

Der producerer betalingsopgørelser i MYOB-dummies

Der producerer betalingsopgørelser i MYOB-dummies

I slutningen af ​​hvert lønningsår (som slutter den 30. juni) kan bruge MYOB til at levere hver medarbejder med et betalingsoversigt. Et betalingsopsamling er et kort dokument, der opsummerer de bruttolønninger, skat og godtgørelser, som medarbejderen har modtaget i løbet af de sidste 12 måneder af ansættelsen. Opsætning af betalingsoversigter Til ...

15 Funktioner, der ikke konverteres og findes ikke i QuickBooks Online

15 Funktioner, der ikke konverteres og findes ikke i QuickBooks Online

Følgende oplysninger viser transaktioner og funktioner, som ikke konverteres fra desktop QuickBooks til QuickBooks Online (QBO) og heller ikke har nogen sammenlignelig funktion i QBO. Selv om en eller flere af disse transaktioner eller funktioner kan være afbrudte afbrydere, skal du huske at for mange af disse funktioner kan du bruge løsninger. Typen af ​​data eller funktional noter ...

Valg af editor

Sådan bruger du FREQUENCY-funktionen i Excel - dummier

Sådan bruger du FREQUENCY-funktionen i Excel - dummier

FREQUENCY-funktionen i Excel tæller værdierne i en array der falder inden for en rækkevidde eller bin. Funktionen bruger følgende syntaks: = FREQUENCY (data_array, bins_array) hvor data_array er det regnearkområde, der indeholder de værdier, du vil tælle, og bins_array er et regnearkområde, der identificerer værdierne eller bakkerne, der ...

Hvordan man bruger målsøgningsfunktionen i Excel 2013 - dummies

Hvordan man bruger målsøgningsfunktionen i Excel 2013 - dummies

, Når du skal analysere , bruger du Excel 2013s målsøgningsfunktion til at finde de indgangsværdier, der er nødvendige for at opnå det ønskede mål. Nogle gange, når du gør hvad-hvis analyse, har du et bestemt udgangspunkt i tankerne, såsom et mål salgsmængde eller vækstprocent. Hvis du vil bruge funktionen Målsøgning placeret på What-If ...

Hvordan man vælger Excel CHOOSE-funktionen i datamodeller - dummier

Hvordan man vælger Excel CHOOSE-funktionen i datamodeller - dummier

Selvom valgmuligheden måske ikke Se nyttige på overfladen, denne funktion kan dramatisk forbedre dine Excel-datamodeller. VÆLG-funktionen returnerer en værdi fra en bestemt liste over værdier baseret på et angivet positionsnummer. Hvis du f.eks. Indtaster formlerne VÆLG (3, "Rød", "Gul", "Grøn", "Blå") i en celle, returnerer Excel ...

Valg af editor

Indlæs en Workflow i SharePoint 2010 - dummies

Indlæs en Workflow i SharePoint 2010 - dummies

Konfigurere dit bibliotek til at bruge en workflow i SharePoint 2010 løser kun en del af problemet. Hvis du ikke har dit bibliotek konfigureret til at kick-off automatisk, skal en person manuelt starte workflowen. Start manuelt en arbejdsgang ved at følge disse trin: Gennemse det element, du vil godkende, klik på rullelisten og vælg Workflows. ...

Bibliotek / Liste Generelle indstillinger Område i SharePoint 2010 - dummies

Bibliotek / Liste Generelle indstillinger Område i SharePoint 2010 - dummies

Bibliotekets generelle indstillinger / listen er blevet udvidet i SharePoint 2010 til at omfatte flere nye indstillinger, herunder validering, kolonne standardværdi (for biblioteker), vurdering, metadata navigation, visningsvisning og formular (for lister). Her er et overblik for at se, hvad du kan gøre med hver af disse muligheder. Generelle indstillinger Konfigurationsindstillinger Indstillingsnavn ...

Importer et regneark som en liste i SharePoint 2010 - dummies

Importer et regneark som en liste i SharePoint 2010 - dummies

Har allerede data i et regneark, som du Vil du være en SharePoint 2010 liste? Du er halvvejs derhen! Før du starter, skal du sørge for at gøre følgende: Rens listen. Sørg for, at din liste ligner et bord uden tomme kolonner eller rækker. Sørg for, at din liste har overskrifter. Alle kolonner skal have en ...