C ++

Životnosť objektu a trvanie úložiska v C ++

Životnosť objektu a trvanie úložiska v C ++
Pri vytváraní objektu je potrebné pred jeho inicializáciou zistiť jeho umiestnenie v pamäti. Inicializácia znamená uvedenie hodnoty do umiestnenia. Životnosť objektu začína hneď po inicializácii. Keď objekt zomrie, uvoľní sa jeho umiestnenie (úložisko), ktoré obsadil, a potom sa počítač vypne alebo úložisko vyberie (použije) iný objekt. Uvoľnenie úložiska znamená neplatnosť identifikátora alebo ukazovateľa, ktorý úložisko obsadil. Životnosť objektu končí, keď sa uvoľní jeho úložisko.

Na vytvorenie objektu je potrebný istý čas. Na zabitie objektu je potrebný istý čas. Keď hovoríme o objekte, sú to dve veci: umiestnenie, ktoré je úložiskom, a hodnota. Význam životnosti a doby skladovania sú podobné; ale na trvanie sa pozeráme viac z pohľadu miesta ako z hľadiska hodnoty. Trvanie úložiska je čas od okamihu, keď je miesto spojené s objektom, do času, keď je miesto oddelené od objektu.

Zvyšok tohto článku ilustruje životnosť objektu a stručne vysvetľuje rôzne doby trvania úložiska. Aby ste pochopili tento článok, mali by ste mať základné znalosti v jazyku C ++. Mali by ste tiež mať znalosti v rozsahu C ++.

Obsah článku

Ilustrácia životnosti objektu

Zvážte nasledujúci program:

#include
pomocou namespace std;
int main ()

ak (1 == 1)

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

návrat 0;

Výstup je 1A .

Životnosť objektu sa končí, keď sa dostane mimo rozsah. Životnosť objektu x sa začína „x = 1;“ a končí sa na konci rozsahu if-local. Životnosť objektu y sa začína „y = 'A';“ a končí sa na konci rozsahu if-local. Predtým, ako oba objekty zomrú, sú použité vo vyhlásení cout .

Doba skladovania

Trvanie pamäte je určené jednou z nasledujúcich schém: automatické trvanie pamäte; doba dynamického ukladania; trvanie statického ukladania; doba uloženia vlákna. Kategórie trvania úložiska sa vzťahujú aj na referencie.

Trvanie automatického ukladania

Ak premenná nie je explicitne deklarovaná ako statická, thread_local alebo extern, potom má táto premenná automatické trvanie úložiska. Príklady sú xay vyššie. Trvanie takýchto premenných končí, keď vyjdú z rozsahu. Nasledujúci program ilustruje trvanie automatického ukladania pre referenciu a ukazovateľ v globálnom rozsahu.

#include
pomocou namespace std;
int x = 1;
int & m = x;
char y = 'A';
char * n = & y;
int main ()

cout << m << *n << '\n';
návrat 0;

Výstup je 1A .

Trvanie m začína od „int & m = x;“ a končí sa na konci programu. Trvanie n začína od „char * n = & y;“ a končí sa na konci programu.

Doba dynamického ukladania

Obchod zadarmo

V modernom počítači môže byť spustených súčasne viac programov. Každý program má svoju vlastnú časť pamäte. Zvyšok pamäte, ktorý nevyužíva žiadny program, sa nazýva voľný obchod. Nasledujúci výraz sa používa na vrátenie polohy celého čísla z bezplatného obchodu

nová int

Toto umiestnenie (úložisko) pre celé číslo, ktoré je vrátené, musí byť stále identifikované priradením ukazovateľa. Nasledujúci kód ilustruje, ako používať ukazovateľ vo voľnom obchode:

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

Výstup je 12 .

Ak chcete ukončiť životnosť objektu, použite nasledujúci výraz:

vymazať ptrInt;

Argument pre výraz delete je ukazovateľ. Nasledujúci kód ilustruje jeho použitie:

int * ptrInt = new int;
* ptrInt = 12;
vymazať ptrInt;

Ukazovateľ vytvorený pomocou nového výrazu a odstránený pomocou výrazu delete má dynamické trvanie pamäte. Tento ukazovateľ zomrie, keď vyjde z rozsahu alebo je odstránený. Trvanie objektu v predchádzajúcom kóde začína na „* ptrInt = 12;“ a končí sa na konci deklaratívnej oblasti (rozsahu). V nových a vymazaných výrazoch je viac, ako tu bolo diskutovaných - pozri ďalej.

Statické trvanie ukladania

Statický objekt

Objekt deklarovaný ako statický sa chová ako bežný objekt, okrem toho, že doba jeho uloženia začína od jeho inicializácie do konca programu. Nemôže byť videný mimo jeho rozsahu, ale môže byť nepriamo zamestnaný mimo jeho rozsahu.

Zvážte nasledujúci program, ktorý má počítať od 1 do 5 (program netestujte):

#include
pomocou namespace std;
int fn ()

int stc = 1;
cout << " << stc;
stc = stc + 1;
ak (stc> 5)
návrat 0;
fn ();

int main ()

fn ();
návrat 0;

Výstup je 1 1 1 1 1 1 1 1 ... a nikdy nekončí. Definícia funkcie je opakujúca sa funkcia; čo znamená, že si hovorí, kým nie je splnená podmienka.

Riešením je statický objekt stc. Po inicializácii statického objektu nie je možné zmeniť jeho hodnotu, kým sa program neskončí. Nasledujúci program (ktorý môžete otestovať), ktorý je rovnaký ako vyššie uvedený program, ale teraz je statický statický, počíta od 1 do 5:

#include
pomocou namespace std;
int fn ()

statický int stc = 1;
cout << " << stc;
stc = stc + 1;
ak (stc> 5)
návrat 0;
fn ();

int main ()

fn ();
návrat 0;

Výstup je: 1 2 3 4 5 .

Poznámka: Trvanie statického objektu začína, keď bol objekt inicializovaný, a končí na konci programu. Medzitým je možné objekt použiť nepriamo, z iného rozsahu. Po inicializácii statického objektu nie je možné zmeniť jeho počiatočnú hodnotu, a to ani v prípade, že sa jeho definícia prehodnocuje. Vo vyššie uvedenom kóde sa stc nereštartuje, pri ďalšom volaní. Pri ďalšom volaní sa zvýši o „stc = stc + 1;“.

Člen statických údajov

Množinu súvisiacich premenných a funkcií je možné vložiť do zovšeobecnenej jednotky nazývanej trieda. Ak sú premenným dané konkrétne hodnoty, trieda sa stane objektom. Objekt sa však nevytvára iba priradením hodnôt k premennej. Trieda je inštancovaná na získanie objektu; a každý vytvorený objekt má svoj vlastný názov odlišný od ostatných objektov tej istej triedy. Nasledujúci program zobrazuje triedu nazvanú TheCla a objekt nazývaný obj; tiež ukazuje, ako je objekt inštancovaný a používaný vo funkcii main ():

#include
pomocou namespace std;
trieda TheCla

verejné:
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");
návrat 0;

Výstup je:

V obchode je 12 kníh v hodnote 500 dolárov.

Všimnite si, že aby bolo možné priradiť hodnotu 12 premennej num, musí sa objekt vytvoriť inštanciou, aby mohlo dôjsť k priradeniu. Je možné, že programátor priradí hodnotu bez vytvorenia inštancie (vytvorenia) objektu. Aby sa to dosiahlo, bude musieť byť premenná, num, deklarovaná ako statická. Potom bude prístupné ako „TheCla :: num“ bez názvu objektu, ale s názvom triedy. Nasledujúci program to ilustruje:

#include
pomocou namespace std;
trieda TheCla

verejné:
static const int num = 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 obj;
obj.func ('$', "500");
návrat 0;

Výstup je:

12
V obchode je 12 kníh v hodnote 500 dolárov.

Upozorňujeme, že na prístup k údajovému členu num in main () bolo potrebné použiť operátor rozlíšenia rozsahu, ::. Tiež nie, že premenná, num musela byť konštantná a inicializovaná v popise triedy (definícii).

Funkcia statického člena

Všimnite si, že v predchádzajúcom zozname programov vyššie, aby bolo možné použiť funkciu func v main (), bolo treba vytvoriť inštanciu objektu. Je možné, že programátor túto funkciu zavolá bez vytvorenia inštancie (vytvorenia) objektu. Aby sa to dosiahlo, pred definíciou funkcie musí byť uvedené slovo „statický“. Potom bude prístupné ako „TheCla :: func ()“ bez názvu objektu, ale s názvom triedy. Nasledujúci program to ilustruje pre statický údajový člen a funkciu statického člena:

#include
pomocou namespace std;
trieda TheCla

verejné:
static const int num = 12;
static void func (char cha, const char * str)

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

;
int main ()

TheCla :: func ('$', "500");
návrat 0;

Výstup je:

V obchode je 12 kníh v hodnote 500 dolárov.

Trvanie uloženia vlákna

Vlákno ako vlastnosť v C ++ ešte nebolo implementované kompilátorom g ++. Takže namiesto vysvetlenia je citácia zo špecifikácie C ++ uvedená nasledovne:

  1. Všetky premenné deklarované kľúčovým slovom thread_local majú trvanie úložiska vlákna. Úložisko pre tieto entity vydrží po dobu vlákna, v ktorom sú vytvorené. Na jedno vlákno existuje samostatný objekt alebo odkaz a použitie deklarovaného názvu sa vzťahuje na entitu spojenú s aktuálnym vláknom.
  2. Premenná s dobou uloženia vlákna sa inicializuje pred prvým použitím zápachu a ak je zostrojená, zničí sa pri výstupe z vlákna.“

Záver

Životnosť objektu začína po dokončení jeho inicializácie a končí sa uvoľnením jeho úložiska. Doba dynamického ukladacieho priestoru začína, keď sa inicializuje úložisko vytvorené (novým typom), a končí sa tým, keď objekt vyjde z rozsahu alebo je odstránený „ukazovateľom odstránenia“. Trvanie statického objektu začína, keď bol objekt inicializovaný, a končí na konci programu. Po inicializácii statického objektu nie je možné zmeniť jeho počiatočnú hodnotu, a to ani v prípade, že sa jeho definícia prehodnocuje. K statickým dátovým členom a členom statickej funkcie sa pristupuje mimo popisu triedy pomocou „ClassName :: name“.

Chrys

Ovládajte a spravujte pohyb myši medzi viacerými monitormi v systéme Windows 10
Správca myši s duálnym displejom umožňuje ovládať a konfigurovať pohyb myši medzi viacerými monitormi spomalením jeho pohybu blízko hranice. Windows 1...
WinMouse vám umožňuje prispôsobiť a vylepšiť pohyb ukazovateľa myši na počítači so systémom Windows
Ak chcete vylepšiť predvolené funkcie kurzora myši, použite freeware WinMouse. Pridáva ďalšie funkcie, ktoré vám pomôžu vyťažiť zo svojej skromnej myš...
Tlačidlo ľavého kliknutia myši nefunguje v systéme Windows 10
Ak používate samostatnú myš s prenosným počítačom alebo stolovým počítačom, ale nefunguje ľavé tlačidlo myši vo Windows 10/8/7 z nejakého dôvodu uvádz...