Objekt levetid og lagringsvarighet i C ++

Objekt levetid og lagringsvarighet i C ++
Mens du oppretter et objekt, må plasseringen i minnet etableres, før det initialiseres. Initialisering betyr å sette verdi inn i stedet. Levetiden til et objekt starter like etter initialisering. Når et objekt dør, blir plasseringen (lagring), som objektet okkuperes utgitt, og deretter blir datamaskinen slått av eller lagringen blir tatt opp (brukt) av et annet objekt. Å slippe en lagring betyr, noe som gjør identifikatoren eller pekeren som okkuperte lagringen, ugyldig. Levetiden til et objekt ender, når lagringen slippes ut.

Litt tid er nødvendig for å lage et objekt. Litt tid er nødvendig for å drepe et objekt. Når du snakker om et objekt, er to ting involvert: plasseringen som er lagring og verdien. Betydningen av levetid og lagringsvarighet er lik; Men varigheten sees mer fra stedet for stedet enn fra verdienes synspunkt. Lagringsvarigheten er tiden fra når et sted er tilknyttet et objekt til tiden da stedet er dissosiert fra objektet.

Resten av denne artikkelen illustrerer objektets levetid, og forklarer kort de forskjellige lagringsvarighetene. 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
  • Lagringsvarighet
  • Automatisk lagringsvarighet
  • Dynamisk lagringsvarighet
  • Statisk lagringsvarighet
  • Trådens lagringsvarighet
  • Konklusjon

Illustrasjon av objektets levetid

Tenk på følgende program:

#inkludere
ved hjelp av navneområdet STD;
int main ()

if (1 == 1)

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

retur 0;

Utgangen er, 1A .

Livet til et objekt kommer til slutt, når det går ut av omfang. Levetiden til objekt X, begynner ved “x = 1;” og ender på slutten av IF-Local-Scope. Levetiden til objekt Y, begynner på “y = 'a';" og ender på slutten av IF-Local-Scope. Før begge objektene dør, er de ansatt i cout -uttalelsen .

Lagringsvarighet

Lagringsvarighet bestemmes av et av følgende ordninger: automatisk lagringsvarighet; dynamisk lagringsvarighet; statisk lagringsvarighet; Trådens lagringsvarighet. Lagringsvarighetskategorier, gjelder også referanser.

Automatisk lagringsvarighet

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

#inkludere
ved hjelp av navneområdet STD;
int x = 1;
int & m = x;
char y = 'a';
char* 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.

Dynamisk lagringsvarighet

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 blir brukt av noe program, er kjent som Free Store. 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 tildeling til 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 slettingsuttrykket som følger:

slett ptrint;

Argumentet for slettingsuttrykket er en peker. Følgende kode illustrerer bruken:

int *ptrint = ny int;
*ptrint = 12;
slett ptrint;

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

Statisk lagringsvarighet

Statisk objekt

Et objekt erklært statisk, oppfører seg som det vanlige objektet, bortsett fra at lagringsvarigheten, begynner fra når det initialiseres til slutten av programmet. Det kan ikke sees utenfor omfanget, men det kan indirekte brukes utenfor omfanget.

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

#inkludere
ved hjelp av navneområdet STD;
int fn ()

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

int main ()

fn ();
retur 0;

Utgangen er 1 1 1 1 1 1 1 1… og slutter egentlig aldri. Funksjonsdefinisjonen er en tilbakevendende funksjon; noe som betyr at det fortsetter å ringe seg selv til en tilstand er oppfylt.

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

#inkludere
ved hjelp av navneområdet STD;
int fn ()

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

int main ()

fn ();
retur 0;

Utgangen er: 1 2 3 4 5 .

Merk: Varigheten av et statisk objekt begynner når objektet er blitt 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 dens opprinnelige verdi ikke endres, selv om definisjonen blir evaluert på nytt. I koden ovenfor tilbakestilles STC ikke, neste gang den kalles. Neste gang det kalles, økes det av "STC = STC + 1;".

Statisk datamedlem

Et sett med relaterte variabler og funksjon kan settes i en generalisert enhet kalt en klasse. Hvis variablene får spesielle verdier, blir klassen et objekt. Imidlertid opprettes ikke et objekt ved å bare tilordne verdier til variabelen. Klassen er instantiert for å få et objekt; Og hvert objekt opprettet har sitt eget navn forskjellig fra andre objekter i samme klasse. Følgende program viser en klasse, kalt Thecla og et objekt, kalt OBJ; Det viser også hvordan objektet blir instantiert og brukt i hovedfunksjonen ():

#inkludere
ved hjelp av navneområdet 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 obj;
obj.num = 12;
obj.func ('$', "500");
retur 0;

Utgangen er:

Det er 12 bøker til en verdi av $ 500 i butikken.

Legg merke til at for å tilordne verdien av 12 til det variable NUM, må objektet bli instantiert, før oppgaven kunne finne sted. Det er mulig for programmereren å tilordne verdien uten å instantisere (opprette) et objekt. For å oppnå dette, må variabelen, NUM, erklæres som statisk. Da får den tilgang til "Thecla :: num" uten objektnavnet, men med klassenavnet. Følgende program illustrerer dette:

#inkludere
ved hjelp av navneområdet STD;
Klasse thecla

offentlig:
statisk konstant num = 12;
void func (char cha, const char *str)
cout << "There are " << num <<
"Bøker verdt" << cha << str <<
" i butikken."" << '\n';

;
int main ()

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

Utgangen er:

12
Det er 12 bøker til en verdi av $ 500 i butikken.

Legg merke til at for å få tilgang til datamedlemmet, NUM i Main (), måtte omfangsoppløsningsoperatøren, :: brukes. Ikke at variabelen, Num måtte gjøres konstant og initialisert i klassebeskrivelsen (definisjon).

Statisk medlemsfunksjon

Legg merke til at i den forrige programoppføringen ovenfor, for å bruke FUNC -funksjonen i Main (), måtte et objekt bli instantiert. Det er mulig for programmereren å kalle funksjonen uten å instantisere (opprette) et objekt. For å oppnå dette, må funksjonsdefinisjonen gå foran med ordet "statisk". Så får den tilgang til "Thecla :: func ()" uten objektnavnet, men med klassenavnet. Følgende program illustrerer dette for statisk datamedlem og statisk medlemsfunksjon:

#inkludere
ved hjelp av navneområdet STD;
Klasse thecla

offentlig:
statisk konstant num = 12;
statisk tomrom func (char cha, const char *str)
cout << "There are " << num <<
"Bøker verdt" << cha << str <<
" i butikken."" << '\n';

;
int main ()

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

Utgangen er:

Det er 12 bøker til en verdi av $ 500 i butikken.

Trådens lagringsvarighet

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

  1. Alle variabler erklært med Tråd_lokal nøkkelord har trådlagringsvarighet. Lagringen for disse enhetene skal vare i varigheten av tråden de er opprettet. Det er et tydelig objekt eller referanse per tråd, og bruk av det deklarerte navnet refererer til enheten tilknyttet den gjeldende tråden.
  2. En variabel med trådlagringsvarighet skal initialiseres før den første ODR-bruken, og hvis den konstrueres, skal ødelegges ved trådutgang.”

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 som er opprettet av (ny type) initialiseres, og slutter når objektet går ut av omfanget eller blir slettet med "slett peker". Varigheten av et statisk objekt begynner når objektet er blitt initialisert, og slutter på slutten av programmet. Når et statisk objekt er initialisert, kan dens opprinnelige verdi ikke endres, selv om definisjonen blir evaluert på nytt. Statiske datamedlemmer og statiske funksjonsmedlemmer får tilgang til utenfor klassebeskrivelsen med "ClassName :: Navn".