Hem Personliga finanser Hur höjningen fungerar i C ++ - dummies

Hur höjningen fungerar i C ++ - dummies

Innehållsförteckning:

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

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

Hopen är ett amorft minneblock som ditt C ++-program kan komma åt efter behov. Lär dig om varför den existerar och hur man använder den.

Precis som det är möjligt att skicka en pekare till en funktion, är det möjligt för en funktion att returnera en pekare. En funktion som returnerar adressen till en dubbel deklareras enligt följande:

dubbel * fn (tomrum);

Men du måste vara mycket försiktig när du återvänder en pekare. För att förstå farorna måste du veta något om variabel räckvidd.

Begränsat omfång i C ++

Omfattning är det intervall över vilket en variabel definieras. Tänk på följande kodbit:

// Följande variabel är tillgänglig för // alla funktioner och definieras så länge // programmet körs (globalt räckvidd) int intGlobal; // följande variabla intChild är tillgängligt // bara till funktionen och definieras endast // så länge som C ++ exekverar barn () eller en // funktion vilket barn () samtal (funktionsomfattning) tomrum (tomrum) {int intChild;} // följande variabla intParent har funktion // scope void parent (void) {int intParent = 0; barn(); int intLater = 0; intParent = intLater;} int main (int nArgs, char * pArgs []) {parent ();}

Detta programfragment börjar med deklarationen av en variabel intGlobal. Denna variabel existerar från det att programmet börjar exekvera tills det avslutas. Du säger att intGlobal "har programmets omfattning. "Du säger också att variabeln" går in i räckvidd "även innan huvudfunktionen () kallas.

Funktionshuvudet () aktiverar omedelbart föräldra (). Det första som processorn ser i parent () är intParent-deklarationen. På den punkten går intParent i räckvidd - det vill säga intParent definieras och är tillgängligt för återstoden av funktionsföräldern ().

Det andra uttalandet i parent () är samtalet till barnet (). Återigen deklarerar funktionsbarnet () en lokal variabel, den här gången intChild. Räckvidden för variabeln intChild är begränsad till funktionsbarnet (). Tekniskt definieras intParent inte inom ramen för barnet () eftersom barnet () inte har tillgång till intParent; Den rörliga intParent fortsätter emellertid att existera medan barnet () exekveras.

När barnet () utgår, kommer variabeln intChild att gå utanför räckvidden. Inte bara är intChild inte längre tillgängligt, det finns inte längre. (Minnet upptaget av intChild returneras till den allmänna poolen som ska användas för andra saker.)

Som förälder () fortsätter exekveringen, varierar intLater-räckvidden i deklarationen. När den förälder () återgår till huvud (), går både intParent och intLater utanför räckvidd.

Eftersom intGlobal förklaras globalt i det här exemplet är det tillgängligt för alla tre funktionerna och förblir tillgängligt för programmets livslängd.

Granskning av räckviddsproblemet i C ++

Följande kodsegment kompilerar utan fel men fungerar inte (hatar du inte det?):

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

Problemet med den här funktionen är att dLocalVariable definieras endast inom funktionsbarnets räckvidd (). Således hänvisas då till minnesadressen för dLocalVariable från barnet (), till en variabel som inte längre existerar. Minnet som dLocalVariable tidigare ockuperade används förmodligen för något annat.

Detta fel är mycket vanligt eftersom det kan krypa upp på ett antal sätt. Tyvärr orsakar detta fel inte att programmet stannar omedelbart. Faktum är att programmet kan fungera bra mest av tiden - det vill säga programmet fortsätter att fungera så länge som minnet som tidigare användes av dLocalVariable inte återanvänds omedelbart. Sådana intermittenta problem är de svåraste att lösa.

Tillhandahåller en lösning med höjden i C ++

Problemet med räckviddet berodde på att C ++ tog tillbaka det lokalt definierade minnet innan programmeraren var klar. Det som behövs är ett block av minne som styrs av programmeraren. Hon kan allokera minnet och lägga tillbaka det när hon vill - inte för att C ++ tycker att det är en bra idé. Ett sådant minnesblock kallas höjden.

Heapminne tilldelas med det nya sökordet följt av den typ av objekt som ska tilldelas. Det nya kommandot bryter en bit av minne från högen tillräckligt stor för att hålla den angivna typen av objekt och returnerar adressen. Till exempel fördelar följande en dubbelvariabel från högen:

dubbel * barn (tomrum) {double * pdLocalVariable = new double; returnera pdLocalVariable;}

Funktionen fungerar nu korrekt. Även om variabeln pdLocalVariable går utom räckvidd när funktionsbarnet () returnerar, det minne som pdLocalVariable hänvisar till inte. En minnesplats returnerad av ny går inte utom räckhåll för att den uttryckligen återförs till högen med hjälp av sökordet raderas, som är speciellt utformat för det ändamålet:

tomföräldrar (tomrum) {// child () returnerar adressen av ett block // av heapminne dubbel * pdMyDouble = barn (); // lagra ett värde där * pdMyDouble = 1. 1; // // // återför nu minnet till högen radera pdMyDouble; pdMyDouble = 0; // …}

Här pekaren returnerad av barnet () används för att lagra ett dubbelvärde. När funktionen är färdig med minnesplatsen returneras den till högen. Funktionsföräldern () sätter pekaren till 0 efter att hålminne har returnerats - det här är inte ett krav, men det är en mycket bra idé.

Om programmeraren felaktigt försöker lagra något i * pdMyDouble efter raderingen, kommer programmet att krascha omedelbart med ett meningsfullt felmeddelande.

Du kan använda nytt för att allokera arrays från högen, men du måste returnera en array med raderingsraden:

int * nArray = new int [10]; nArray [0] = 0; ta bort [] nArray;

Tekniskt nytt int [10] åberopar den nya [] operatören men det fungerar detsamma som nytt.

Hur höjningen fungerar i C ++ - dummies

Redaktörens val

Hitta hur du betalar webbplatser i online dating - dummies

Hitta hur du betalar webbplatser i online dating - dummies

Du får vad du betalar för I livet ingår Internet-dating webbplatser. Till skillnad från gratis webbplatser, med lönesidor har du inte huvudvärk på oändliga reklammeddelanden som skriker i ditt ansikte. Dessutom är omfattningen av täckning och tillgängliga funktioner bred och robust. Solid tillsyn tillhandahålls (för att gräva ut wackos) och lämpliga hinder ...

Dating för Dummies Cheat Sheet - dummies

Dating för Dummies Cheat Sheet - dummies

Dating behöver inte vara nervös, men det kräver förberedelse . Du måste göra en uppriktig själsökning så att du är redo att vara ärlig, öppen och uppmärksam. Du behöver en stark känsla för dina dejtingförväntningar så att du tydligt kan kommunicera vad du letar efter utan att ställa in baren så hög att ingen ...

Få passar för dating igen efter 50 - dummies

Få passar för dating igen efter 50 - dummies

Copyright © 2014 AARP All rights reserved. Du behöver inte vara frisk och frisk efter 50, men det hjälper säkert om du är. Om du inte är något av dessa saker, behöver du inte ge upp och tycker att det är för sent att komma dit. Många börjar träningsregler så sent som ålder ...

Redaktörens val

ÄR ett au pair rätt för din familj? - dummies

ÄR ett au pair rätt för din familj? - dummies

Det är viktigt att undersöka dina specifika familjeförhållanden för att avgöra om ett au pair är rätt barnomsorg för din familj. Du kanske bestämmer dig för att anställa ett au pair i stället för daghem, barnbarn eller barnpassare om du vill utsätta din familj för en ny kultur. Är ...

Online-verktyg för familjebudgetar - dummies

Online-verktyg för familjebudgetar - dummies

Vissa familjer kan tycka att den mest användbara aspekten av att bo i en värld med nästan oändliga onlineverktyg innebär att kunna budgetera för familjen med dessa verktyg. Följande tre onlinetjänster erbjuder familjer ett sätt att organisera familjeutgifter online, dela åtkomst till säkra konton och eliminera några av papperet ...

Barn som Online Entreprenörer - Dummies

Barn som Online Entreprenörer - Dummies

Levande i en digital värld tillåter barnen obegränsade möjligheter när det gäller entreprenörskap. Denna digitala tidsålder ger barnen en unik färdighetssats med möjlighet att dela den färdigheten med andra och lägga till "onlineföretagare" till listan över möjliga efterskolor och sommarjobb som finns tillgängliga för barn idag. Spelskapande Ett område där digitalt ...

Redaktörens val

Word 2007 Mail Merge - Steg 3: Byggnadsrekord - dummies

Word 2007 Mail Merge - Steg 3: Byggnadsrekord - dummies

Efter att ha definierat de fält du behöver för din Word 2007-postfusion, är nästa steg att slutföra adresslistan. För att göra det skapar du en lista över poster genom att ange data för varje fält i varje post. Detta händer i dialogrutan Ny adresslista. Kom ihåg att fält är kolumner och ...

Word 2007 Mail Merge - Steg 5: Final Merge - dummies

Word 2007 Mail Merge - Steg 5: Final Merge - dummies

Med sammanfogningsfälten infogad i huvudversionen av Word 2007-dokumentet och adresslistan stannar, är du redo att starta din mailfusion! Spara huvuddokumentet. Klicka på knappen Förhandsgranska resultat. Fälten i huvuddokumentet försvinner! De ersätts av information från den första posten i adresslistan. Så här ...