C ++

Objektets levetid og opbevaringstid i C ++

Objektets levetid og opbevaringstid i C ++
Mens du opretter et objekt, skal dets placering i hukommelsen etableres, før den initialiseres. Initialisering betyder at lægge værdi på placeringen. Et objekts levetid starter lige efter initialisering. Når et objekt dør, frigives dets placering (opbevaring), som det besatte objekt, og derefter lukkes computeren ned, eller opbevaringen optages (bruges) af et andet objekt. Frigivelse af et lager betyder, at identifikatoren eller markøren, der besatte lagringen, er ugyldig. Levetiden for et objekt slutter, når dets lagring frigives.

Der kræves noget tid til at oprette et objekt. Der kræves noget tid til at dræbe en genstand. Når vi taler om et objekt, er der to ting involveret: placeringen, der er lageret, og værdien. Betydningen af ​​levetid og oplagringsvarighed er ens; men varigheden ses mere fra stedets synspunkt end fra værdiens synspunkt. Lagringsvarigheden er det tidspunkt, hvor en placering er knyttet til et objekt til det tidspunkt, hvor placeringen adskilles fra objektet.

Resten af ​​denne artikel illustrerer objektets levetid og forklarer kort de forskellige opbevaringstider. Du skal have grundlæggende viden i C ++ for at forstå denne artikel. Du skal også have viden inden for C ++ - omfang.

Artikelindhold

Illustration af objektets levetid

Overvej følgende program:

#omfatte
ved hjælp af namespace std;
int main ()

hvis (1 == 1)

int x;
x = 1;
char y;
y = 'A';
cout << x << y << '\n';

returnere 0;

Outputtet er 1A .

Et objekts liv slutter, når det går uden for anvendelsesområdet. Objektets levetid begynder med “x = 1;” og slutter i slutningen af ​​if-local-scope. Objektets y levetid begynder med “y = 'A';” og slutter i slutningen af ​​if-local-scope. Før begge objekter dør, er de ansat i cout-erklæringen .

Opbevaringstid

Lagringsvarighed bestemmes af en af ​​følgende ordninger: automatisk lagringsvarighed; dynamisk lagervarighed statisk opbevaringsvarighed trådopbevaringens varighed. Lagringstidskategorier gælder også for referencer.

Automatisk opbevaringstid

Hvis en variabel ikke eksplicit erklæres som statisk, trådlokal eller ekstern, har variablen automatisk lagringsvarighed. Eksempler er x og y ovenfor. Varigheden af ​​sådanne variabler slutter, når de går uden for anvendelsesområdet. Følgende program illustrerer automatisk lagringsvarighed for en reference og en markør i det globale omfang.

#omfatte
ved hjælp af namespace std;
int x = 1;
int & m = x;
char y = 'A';
char * n = & y;
int main ()

cout << m << *n << '\n';
returnere 0;

Outputtet er 1A .

Varigheden af ​​m starter fra “int & m = x;” og slutter i slutningen af ​​programmet. Varigheden af ​​n starter fra “char * n = & y;” og slutter i slutningen af ​​programmet.

Varighed af dynamisk opbevaring

Gratis butik

På en moderne computer kan mere end et program køre på samme tid. Hvert program har sin egen del af hukommelsen. Resten af ​​hukommelsen, der ikke bruges af noget program, kaldes gratis butik. Følgende udtryk bruges til at returnere et sted for et heltal fra gratis butik

ny int

Denne placering (lagring) for heltal, returneret, skal stadig identificeres ved tildeling til en markør. Følgende kode illustrerer, hvordan du bruger markøren med gratis butik:

int * ptrInt = ny int;
* ptrInt = 12;
cout<< *ptrInt <<'\n';

Outputtet er 12 .

For at afslutte objektets levetid skal du bruge sletteudtrykket som følger:

slet ptrInt;

Argumentet for sletteudtrykket er en markør. Følgende kode illustrerer dens anvendelse:

int * ptrInt = ny int;
* ptrInt = 12;
slet ptrInt;

En markør oprettet med det nye udtryk og slettet med sletteudtrykket har dynamisk lagervarighed. Denne markør dør, når den går uden for rækkevidde eller slettes. Varigheden af ​​objektet i den forrige kode starter ved “* ptrInt = 12;” og slutter i slutningen af ​​den deklarative region (omfang). Der er mere ved de nye og slette udtryk, end der er diskuteret her - se senere.

Statisk opbevaringsvarighed

Statisk objekt

Et objekt, der er erklæret statisk, opfører sig som det almindelige objekt, bortset fra at dets lagringsvarighed begynder fra det tidspunkt, hvor det initialiseres til slutningen af ​​programmet. Det kan ikke ses uden for dets anvendelsesområde, men det kan indirekte anvendes uden for dets anvendelsesområde.

Overvej følgende program, som formodes at tælle fra 1 til 5 (test ikke programmet):

#omfatte
ved hjælp af namespace std;
int fn ()

int stc = 1;
cout << " << stc;
stc = stc + 1;
hvis (stc> 5)
returnere 0;
fn ();

int main ()

fn ();
returnere 0;

Outputtet er 1 1 1 1 1 1 1 1 ... og slutter aldrig rigtig. Funktionsdefinitionen er en tilbagevendende funktion; hvilket betyder, at det bliver ved med at kalde sig, indtil en betingelse er opfyldt.

Løsningen er at gøre stc-objektet statisk. Når et statisk objekt er initialiseret, kan dets værdi ikke ændres, før programmet slutter. Følgende program (som du kan teste), som er det samme som ovenfor, men nu med stc lavet statisk, tæller fra 1 til 5:

#omfatte
ved hjælp af namespace std;
int fn ()

statisk int stc = 1;
cout << " << stc;
stc = stc + 1;
hvis (stc> 5)
returnere 0;
fn ();

int main ()

fn ();
returnere 0;

Outputtet er: 1 2 3 4 5 .

Bemærk: Varigheden af ​​et statisk objekt begynder, når objektet er initialiseret og slutter i slutningen af ​​programmet. I mellemtiden kan objektet bruges indirekte fra et andet omfang. Når et statisk objekt er initialiseret, kan dets oprindelige værdi ikke ændres, selvom dets definition evalueres igen. I ovenstående kode nulstilles ikke stc, næste gang det kaldes. Næste gang det kaldes, øges det med “stc = stc + 1;”.

Statisk datamedlem

Et sæt relaterede variabler og funktion kan placeres i en generaliseret enhed kaldet en klasse. Hvis variablerne får bestemte værdier, bliver klassen et objekt. Imidlertid oprettes et objekt ikke ved blot at tildele værdier til variablen. Klassen instantieres for at opnå et objekt; og hvert oprettet objekt har sit eget navn, der adskiller sig fra andre objekter i samme klasse. Følgende program viser en klasse, kaldet TheCla og et objekt, kaldet obj; det viser også, hvordan objektet instantieres og bruges i hovedfunktionen ():

#omfatte
ved hjælp af namespace std;
klasse TheCla

offentlig:
int num;
ugyldig funk (char cha, const char * str)

cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

;
int main ()

TheCla protesterer;
obj.num = 12;
obj.func ('$', "500");
returnere 0;

Outputtet er:

Der er 12 bøger til en værdi af $ 500 i butikken.

Bemærk, at for at tildele værdien 12 til variablen num, skal objektet instantieres, før tildelingen kunne finde sted. Det er muligt for programmøren at tildele værdien uden at instantere (oprette) et objekt. For at opnå dette skal variablen num erklæres som statisk. Derefter åbnes den som “TheCla :: num” uden objektnavnet, men med klassens navn. Følgende program illustrerer dette:

#omfatte
ved hjælp af namespace std;
klasse TheCla

offentlig:
statisk konst int int = 12;
ugyldig funk (char cha, const char * str)

cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

;
int main ()

cout << TheCla::num << '\n';
TheCla protesterer;
obj.func ('$', "500");
returnere 0;

Outputtet er:

12
Der er 12 bøger til en værdi af $ 500 i butikken.

Bemærk, at for at få adgang til datamedlemet, num in main (), skulle områdesopløsningsoperatøren :: bruges. Også ikke at variablen, num skulle gøres konstant og initialiseres i klassebeskrivelsen (definition).

Statisk medlemsfunktion

Bemærk, at for at kunne bruge func-funktionen i main () i den forrige programliste ovenfor, måtte et objekt instantieres. Det er muligt for programmøren at ringe til funktionen uden at instantere (oprette) et objekt. For at opnå dette skal funktionsdefinitionen forud for ordet "statisk". Derefter åbnes den som “TheCla :: func ()” uden objektnavnet, men med klassens navn. Følgende program illustrerer dette for statisk datamedlem og statisk medlemsfunktion:

#omfatte
ved hjælp af namespace std;
klasse TheCla

offentlig:
statisk konst int int = 12;
statisk tomrumsfunktion (char cha, const char * str)

cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

;
int main ()

TheCla :: func ('$', "500");
returnere 0;

Outputtet er:

Der er 12 bøger til en værdi af $ 500 i butikken.

Trådopbevaringsvarighed

Tråd som en funktion i C ++ er endnu ikke implementeret af g ++ compileren. Så i stedet for at forklare dette gives citatet fra C ++ specifikationen som følger:

  1. Alle variabler, der er angivet med nøgleordet thread_local, har trådlagringsvarighed. Opbevaringen for disse enheder skal vare i den tråd, hvori de oprettes. Der er et særskilt objekt eller reference pr. Tråd, og brug af det deklarerede navn henviser til den enhed, der er knyttet til den aktuelle tråd.
  2. En variabel med trådopbevaringsvarighed skal initialiseres før den første odr-brug, og hvis den er konstrueret, skal den destrueres ved trådudgang.”

Konklusion

Et objekts levetid begynder, når initialiseringen er afsluttet og slutter, når dets lagring frigives. Dynamisk lagringsvarighed starter, når lageret oprettet af (ny type) initialiseres og slutter, når objektet går uden for rækkevidde eller slettes af "slet pointer". Varigheden af ​​et statisk objekt begynder, når objektet er initialiseret og slutter i slutningen af ​​programmet. Når et statisk objekt er initialiseret, kan dets oprindelige værdi ikke ændres, selvom dets definition evalueres igen. Statiske datamedlemmer og statiske funktionsmedlemmer fås uden for klassebeskrivelsen med "ClassName :: name".

Chrys

Top 5 spiloptagelseskort
Vi har alle set og elsket streaming af gameplay på YouTube. PewDiePie, Jakesepticye og Markiplier er kun nogle af de bedste spillere, der har tjent mi...
Sådan udvikler du et spil på Linux
For et årti siden ville ikke mange Linux-brugere forudsige, at deres foretrukne operativsystem en dag ville være en populær spilplatform til kommercie...
Open Source-porte med kommercielle spilmotorer
Gratis, open source og cross-platform spilmotorgendringer kan bruges til at spille gamle såvel som nogle af de temmelig nylige spiltitler. Denne artik...