C ++

Objektets levetid og lagringstid i C ++

Objektets levetid og lagringstid i C ++
Mens du lager et objekt, må dets plassering i minnet være etablert før det initialiseres. Initialisering betyr å sette verdi på stedet. Levetiden til et objekt starter like etter initialisering. Når et objekt dør, frigjøres dets plassering (lagring), som objektet okkuperte, og datamaskinen stenges eller lagringen tas opp (brukt) av et annet objekt. Å frigjøre et lagringsmiddel, gjør identifikatoren eller pekeren som okkuperte lagringen, ugyldig. Levetiden til et objekt slutter når lagringen frigjøres.

Det kreves litt tid for å lage et objekt. Det kreves litt tid for å drepe et objekt. Når du snakker om et objekt, er to ting involvert: plasseringen som er lagringen og verdien. Betydningen av levetid og lagringsvarighet er lik; men varigheten ses mer fra stedets synspunkt enn fra verdien av verdien. Lagringsvarigheten er tiden fra et sted er knyttet til et objekt til det tidspunktet hvor stedet er dissosiert fra objektet.

Resten av denne artikkelen illustrerer gjenstandens levetid, og forklarer kort de forskjellige lagringstiden. Du bør ha grunnleggende kunnskap i C ++ for å forstå denne artikkelen. Du bør også ha kunnskap i C ++ omfang.

Artikkelinnhold

Illustrasjon av objektets levetid

Tenk på følgende program:

#inkludere
bruker navneområde std;
int main ()

hvis (1 == 1)

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

retur 0;

Utgangen er 1A .

Livet til et objekt slutter når det går utenfor omfanget. Levetiden til objektet x begynner med “x = 1;” og slutter på slutten av if-local-scope. Levetiden til objektet y begynner med “y = 'A';” og slutter på slutten av if-local-scope. Før begge objektene dør, er de ansatt i cout-uttalelsen .

Lagringstid

Lagringsvarighet bestemmes av ett av følgende skjemaer: automatisk lagringsvarighet; dynamisk lagringsvarighet; statisk lagringsvarighet; trådlagringsvarighet. Lagringstidskategorier, gjelder også referanser.

Varighet for automatisk lagring

Hvis en variabel ikke er erklært eksplisitt som statisk, trådlokal eller ekstern, har variabelen automatisk lagringsvarighet. Eksempler er x og y ovenfor. Varigheten av slike variabler slutter når de går utenfor omfanget. Følgende program illustrerer automatisk lagringsvarighet for en referanse og en peker, i det globale omfanget.

#inkludere
bruker navneområde std;
int x = 1;
int & m = x;
char y = 'A';
røye * n = & y;
int main ()

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

Utgangen er 1A .

Varigheten av m starter fra “int & m = x;” og slutter på slutten av programmet. Varigheten av n starter fra “char * n = & y;” og slutter på slutten av programmet.

Varighet for dynamisk lagring

Gratis butikk

I en moderne datamaskin kan mer enn ett program kjøres samtidig. Hvert program har sin egen del av minnet. Resten av minnet som ikke brukes av noe program, er kjent som gratis butikk. Følgende uttrykk brukes til å returnere et sted for et heltall fra gratis butikk

ny int

Denne plasseringen (lagring) for heltallet, returnert, må fremdeles identifiseres ved å tilordne en peker. Følgende kode illustrerer hvordan du bruker pekeren med gratis butikk:

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

Utgangen er 12 .

For å få slutt på objektets levetid, bruk sletteuttrykket som følger:

slett ptrInt;

Argumentet for sletteuttrykket er en peker. Følgende kode illustrerer bruken av den:

int * ptrInt = ny int;
* ptrInt = 12;
slett ptrInt;

En peker opprettet med det nye uttrykket og slettet med slettingsuttrykket, har dynamisk lagringsvarighet. Denne pekeren dør når den går utenfor omfanget, eller blir slettet. Varigheten av objektet i den forrige koden starter med “* ptrInt = 12;” og slutter på slutten av den deklarative regionen (omfang). Det er mer med de nye og slett uttrykkene enn det som er diskutert her - se senere.

Varighet for statisk lagring

Statisk objekt

Et objekt som er erklært statisk, oppfører seg som det vanlige objektet, bortsett fra at lagringstiden begynner fra det initialiseres til slutten av programmet. Det kan ikke sees utenfor dets virkeområde, men det kan indirekte ansettes utenfor sitt virkeområde.

Vurder følgende program, som skal telle fra 1 til 5 (ikke test programmet):

#inkludere
bruker navneområde std;
int fn ()

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

int main ()

fn ();
retur 0;

Utgangen er 1 1 1 1 1 1 1 1 ... og slutter egentlig ikke. Funksjonsdefinisjonen er en tilbakevendende funksjon; Det betyr at det fortsetter å kalle seg til en betingelse er oppfylt.

Løsningen er å gjøre stc-objektet statisk. Når et statisk objekt er initialisert, kan ikke verdien endres før programmet avsluttes. Følgende program (som du kan teste), som er det samme som ovenfor, men nå med stc laget statisk, teller fra 1 til 5:

#inkludere
bruker navneområde std;
int fn ()

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

int main ()

fn ();
retur 0;

Utgangen er: 1 2 3 4 5 .

Merk: Varigheten til et statisk objekt begynner når objektet er initialisert og slutter på slutten av programmet. I mellomtiden kan objektet brukes indirekte, fra et annet omfang. Når et statisk objekt er initialisert, kan ikke dets opprinnelige verdi endres, selv om definisjonen blir evaluert på nytt. I koden ovenfor blir ikke stc tilbakestilt, neste gang den blir ringt. Neste gang den heter, økes den med “stc = stc + 1;”.

Statisk datamedlem

Et sett med relaterte variabler og funksjon kan settes i en generalisert enhet kalt klasse. Hvis variablene får spesielle verdier, blir klassen et objekt. Imidlertid opprettes ikke et objekt ved bare å tilordne verdier til variabelen. Klassen blir instansert for å skaffe seg et objekt; og hvert opprettet objekt har sitt eget navn som er forskjellig fra andre objekter i samme klasse. Det følgende programmet viser en klasse, kalt TheCla og et objekt, kalt obj; det viser også hvordan objektet instantieres og brukes i hovedfunksjonen ():

#inkludere
bruker navneområde std;
klasse TheCla

offentlig:
int num;
void func (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");
retur 0;

Utgangen er:

Det er 12 bøker verdt $ 500 i butikken.

Legg merke til at for å tilordne verdien 12 til variabelen num, må objektet instansieres før tildelingen kan finne sted. Det er mulig for programmereren å tilordne verdien uten å øyeblikkelig (opprette) et objekt. For å oppnå dette må variabelen num erklæres som statisk. Deretter vil du få tilgang til den som “TheCla :: num” uten objektnavnet, men med klassenavnet. Følgende program illustrerer dette:

#inkludere
bruker navneområde std;
klasse TheCla

offentlig:
statisk konst int int = 12;
void func (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");
retur 0;

Utgangen er:

12
Det er 12 bøker verdt $ 500 i butikken.

Merk at for å få tilgang til datamedlemmet, num in main (), må operatøren for omfangsoppløsning, :: brukes. Heller ikke at variabelen, num måtte gjøres konstant og initialiseres i klassebeskrivelsen (definisjon).

Statisk medlemsfunksjon

Legg merke til at for å kunne bruke funksjonen i hoved () i forrige programoppføring ovenfor, måtte et objekt instantieres. Det er mulig for programmereren å ringe til funksjonen uten å instantiere (opprette) et objekt. For å oppnå dette, må funksjonsdefinisjonen gå foran ordet "statisk". Deretter vil du få tilgang til den som “TheCla :: func ()” uten objektnavnet, men med klassenavnet. Følgende program illustrerer dette for statisk datamedlem og statisk medlemsfunksjon:

#inkludere
bruker navneområde std;
klasse TheCla

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

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

;
int main ()

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

Utgangen er:

Det er 12 bøker verdt $ 500 i butikken.

Trådlagringsvarighet

Tråden som en funksjon i C ++, er ennå ikke implementert av g ++ kompilatoren. Så, i stedet for å forklare dette, blir sitatet fra C ++ spesifikasjonen gitt som følger:

  1. Alle variabler som er angitt med nøkkelordet thread_local, har trådlagringsvarighet. Lagringen for disse enhetene skal vare så lenge tråden de er opprettet i. Det er et tydelig objekt eller referanse per tråd, og bruk av det deklarerte navnet refererer til enheten som er tilknyttet den gjeldende tråden.
  2. En variabel med trådlagringsvarighet skal initialiseres før første bruk, og hvis den er konstruert, skal den ødelegges ved trådutgangen.”

Konklusjon

Levetiden til et objekt begynner når initialiseringen er fullført, og slutter når lagringen frigjøres. Dynamisk lagringsvarighet starter når lagringen opprettet av (ny type) initialiseres, og slutter når objektet går utenfor omfanget eller slettes av "slett pekeren". Varigheten til et statisk objekt begynner når objektet er initialisert og slutter på slutten av programmet. Når et statisk objekt er initialisert, kan ikke dets opprinnelige verdi endres, selv om definisjonen blir evaluert på nytt. Statiske datamedlemmer og statiske funksjonsmedlemmer er tilgjengelige utenfor klassebeskrivelsen med “ClassName :: name”.

Chrys

Mus Hvordan endre musepekeren og markørstørrelse, farge og skjema på Windows 10
Hvordan endre musepekeren og markørstørrelse, farge og skjema på Windows 10
Musepekeren og markøren i Windows 10 er veldig viktige aspekter ved operativsystemet. Dette kan sies også for andre operativsystemer, så i sannhet er ...
Gratis og åpen kildekode-spillmotorer for utvikling av Linux-spill
Denne artikkelen vil dekke en liste over gratis og open source-spillmotorer som kan brukes til å utvikle 2D- og 3D-spill på Linux. Det er mange slike ...
Shadow of the Tomb Raider for Linux Tutorial
Shadow of the Tomb Raider er det tolvte tilskuddet til Tomb Raider-serien - et action-eventyrspill-franchise opprettet av Eidos Montreal. Spillet ble ...