C ++

Životnost objektu a doba skladování v C ++

Životnost objektu a doba skladování v C ++
Při vytváření objektu je třeba určit jeho umístění v paměti, než bude inicializován. Inicializace znamená uvedení hodnoty do umístění. Životnost objektu začíná těsně po inicializaci. Když objekt zemře, uvolní se jeho umístění (úložiště), které objekt obsadil, a poté se počítač vypne nebo úložiště je převzato (použito) jiným objektem. Uvolnění úložiště znamená zneplatnění identifikátoru nebo ukazatele, který úložiště zabíral. Životnost objektu končí, když je uvolněno jeho úložiště.

K vytvoření objektu je zapotřebí nějaký čas. K zabití předmětu je zapotřebí nějaký čas. Když mluvíme o objektu, jedná se o dvě věci: umístění, kterým je úložiště, a hodnotu. Význam životnosti a doby skladování jsou podobné; ale doba trvání je viděna spíše z hlediska místa než z hlediska hodnoty. Trvání úložiště je doba od okamžiku, kdy je umístění přidruženo k objektu, do doby, kdy je umístění odloučeno od objektu.

Zbytek tohoto článku ilustruje životnost objektu a stručně vysvětluje různé doby trvání úložiště. Abyste porozuměli tomuto článku, měli byste mít základní znalosti v C ++. Měli byste mít také znalosti v oboru C ++.

Obsah článku

Ilustrace životnosti objektu

Zvažte následující program:

#zahrnout
pomocí jmenného prostoru std;
int main ()

pokud (1 == 1)

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

návrat 0;

Výstup je 1A .

Život objektu končí, když vyjde z rozsahu. Životnost objektu x začíná „x = 1;“ a končí na konci rozsahu if-local. Životnost objektu y začíná na „y = 'A';“ a končí na konci if-local-scope. Předtím, než oba objekty zemřou, jsou použity ve výrazu cout .

Doba skladování

Doba ukládání je určena jedním z následujících schémat: doba automatického ukládání; doba dynamického ukládání; doba statického úložiště; doba uložení vlákna. Kategorie trvání úložiště, platí také pro reference.

Doba automatického ukládání

Pokud proměnná není explicitně deklarována jako static, thread_local nebo extern, pak má tato proměnná automatické trvání úložiště. Příklady jsou xay výše. Doba trvání těchto proměnných končí, když vyjdou z rozsahu. Následující program ilustruje automatické trvání úložiště pro referenci a ukazatel v globálním rozsahu.

#zahrnout
pomocí jmenného prostoru 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 .

Doba trvání m začíná „int & m = x;“ a končí na konci programu. Doba trvání n začíná „char * n = & y;“ a končí na konci programu.

Doba dynamického úložiště

Obchod zdarma

V moderním počítači může být spuštěn více než jeden program současně. Každý program má svou vlastní část paměti. Zbytek paměti, který nepoužívá žádný program, se nazývá volné úložiště. Následující výraz se používá k vrácení umístění pro celé číslo z bezplatného úložiště

nová int

Toto umístění (úložiště) pro celé číslo, vrácené, musí být stále identifikováno přiřazením k ukazateli. Následující kód ukazuje, jak používat ukazatel s volným úložištěm:

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

Výstup je 12 .

Chcete-li ukončit životnost objektu, použijte výraz odstranění následujícím způsobem:

smazat ptrInt;

Argument výrazu odstranění je ukazatel. Následující kód ilustruje jeho použití:

int * ptrInt = new int;
* ptrInt = 12;
smazat ptrInt;

Ukazatel vytvořený s novým výrazem a odstraněný pomocí výrazu odstranění má dynamické trvání úložiště. Tento ukazatel umírá, když jde mimo rozsah nebo je odstraněn. Doba trvání objektu v předchozím kódu začíná na „* ptrInt = 12;“ a končí na konci deklarativní oblasti (rozsahu). Nové výrazy a výrazy mazání obsahují více, než o čem jsme zde hovořili - viz dále.

Statická doba skladování

Statický objekt

Objekt deklarovaný jako statický, chová se jako běžný objekt, kromě toho, že jeho doba trvání úložiště začíná od jeho inicializace do konce programu. Nemůže být viděn mimo jeho rozsah, ale může být nepřímo použit mimo jeho rozsah.

Zvažte následující program, který má počítat od 1 do 5 (netestujte program):

#zahrnout
pomocí jmenného prostoru std;
int fn ()

int stc = 1;
cout << " << stc;
stc = stc + 1;
pokud (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 opravdu nekončí. Definice funkce je opakující se funkce; což znamená, že se stále volá, dokud není splněna podmínka.

Řešením je statický objekt stc. Po inicializaci statického objektu nelze jeho hodnotu změnit, dokud program neskončí. Následující program (který můžete otestovat), který je stejný jako výše uvedený, ale nyní je statický statický, počítá od 1 do 5:

#zahrnout
pomocí jmenného prostoru std;
int fn ()

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

int main ()

fn ();
návrat 0;

Výstup je: 1 2 3 4 5 .

Poznámka: Doba trvání statického objektu začíná, když byl objekt inicializován, a končí na konci programu. Mezitím lze objekt použít nepřímo, z jiného rozsahu. Po inicializaci statického objektu nelze jeho počáteční hodnotu změnit, i když je jeho definice přehodnocena. Ve výše uvedeném kódu není stc resetován, při příštím volání. Při příštím volání se zvýší o „stc = stc + 1;“.

Statický datový člen

Sada souvisejících proměnných a funkcí může být vložena do zobecněné jednotky zvané třída. Pokud jsou proměnné uvedeny konkrétní hodnoty, třída se stane objektem. Objekt však není vytvořen pouhým přiřazením hodnot proměnné. Třída je vytvořena pro získání objektu; a každý vytvořený objekt má svůj vlastní název odlišný od ostatních objektů stejné třídy. Následující program ukazuje třídu nazvanou TheCla a objekt zvaný obj; také ukazuje, jak je objekt instancován a používán ve funkci main ():

#zahrnout
pomocí jmenného prostoru std;
třída TheCla

veřejnost:
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ýstupem je:

V obchodě je 12 knih v hodnotě 500 $.

Všimněte si, že aby bylo možné přiřadit hodnotu 12 proměnné num, musí být objekt instancován, než může dojít k přiřazení. Je možné, že programátor přiřadí hodnotu bez vytvoření instance (vytvoření) objektu. K dosažení tohoto cíle bude muset být proměnná num deklarována jako statická. Poté k němu bude přistupováno jako „TheCla :: num“ bez názvu objektu, ale s názvem třídy. Ilustruje to následující program:

#zahrnout
pomocí jmenného prostoru std;
třída TheCla

veřejnost:
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ýstupem je:

12
V obchodě je 12 knih v hodnotě 500 $.

Všimněte si, že pro přístup k datovému členu, num in main (), musel být použit operátor rozlišení oboru, ::. Také ne, že proměnná, num musela být konstantní a inicializována v popisu třídy (definice).

Funkce statického člena

Všimněte si, že v předchozím seznamu programů výše, aby bylo možné použít funkci func v main (), bylo nutné vytvořit instanci objektu. Je možné, aby programátor zavolal funkci bez vytvoření instance (vytvoření) objektu. K dosažení tohoto cíle musí definici funkce předcházet slovo „statický“. Poté k němu bude přistupováno jako „TheCla :: func ()“ bez názvu objektu, ale s názvem třídy. Následující program to ilustruje pro statický datový člen a statickou členskou funkci:

#zahrnout
pomocí jmenného prostoru std;
třída TheCla

veřejnost:
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ýstupem je:

V obchodě je 12 knih v hodnotě 500 $.

Doba uložení vlákna

Vlákno jako funkce v C ++ ještě nebylo implementováno kompilátorem g ++. Takže místo toho, abychom to vysvětlili, je citát ze specifikace C ++ uveden následovně:

  1. Všechny proměnné deklarované klíčovým slovem thread_local mají trvání úložiště vláken. Úložiště pro tyto entity vydrží po dobu vlákna, ve kterém jsou vytvořeny. Na jedno vlákno existuje zřetelný objekt nebo odkaz a použití deklarovaného názvu odkazuje na entitu přidruženou k aktuálnímu vláknu.
  2. Proměnná s dobou ukládání podprocesů musí být inicializována před prvním použitím odr a pokud je vytvořena, musí být zničena při výstupu podprocesu.“

Závěr

Životnost objektu začíná, když je dokončena jeho inicializace, a končí, když je uvolněno jeho úložiště. Doba dynamického úložiště začíná, když je úložiště vytvořené (novým typem) inicializováno, a končí, když objekt přejde z rozsahu nebo je odstraněn pomocí ukazatele „odstranění“. Doba trvání statického objektu začíná, když byl objekt inicializován, a končí na konci programu. Po inicializaci statického objektu nelze jeho počáteční hodnotu změnit, i když je jeho definice přehodnocena. Ke statickým datovým členům a statickým funkčním členům se přistupuje mimo popis třídy pomocí „ClassName :: name“.

Chrys

Hry Porty komerčních her s otevřeným zdrojovým kódem
Porty komerčních her s otevřeným zdrojovým kódem
Zdarma, s otevřeným zdrojovým kódem a multiplatformní herní enginy lze hrát staré i některé z poměrně nedávných herních titulů. Tento článek uvede sez...
Hry Nejlepší hry z příkazového řádku pro Linux
Nejlepší hry z příkazového řádku pro Linux
Příkazový řádek není při používání Linuxu jen vaším největším spojencem - může být také zdrojem zábavy, protože jej můžete použít k hraní mnoha zábavn...
Hry Nejlepší aplikace pro mapování gamepadu pro Linux
Nejlepší aplikace pro mapování gamepadu pro Linux
Pokud rádi hrajete hry na Linuxu s gamepadem místo typického vstupního systému pro klávesnici a myš, máte k dispozici několik užitečných aplikací. Mno...