Durée de la durée de vie et de stockage de l'objet en C ++

Durée de la durée de vie et de stockage de l'objet en C ++
Lors de la création d'un objet, son emplacement en mémoire doit être établi, avant qu'il ne soit initialisé. L'initialisation signifie mettre de la valeur dans l'emplacement. La durée de vie d'un objet commence juste après l'initialisation. Lorsqu'un objet décède, son emplacement (stockage), que l'objet occupé est libéré, puis l'ordinateur est arrêté ou le stockage est repris (utilisé) par un autre objet. Libérer un moyen de stockage, ce qui rend l'identifiant ou le pointeur qui occupait le stockage, invalide. La durée de vie d'un objet se termine, lorsque son stockage est libéré.

Un certain temps est nécessaire pour créer un objet. Un certain temps est nécessaire pour tuer un objet. Lorsque vous parlez d'un objet, deux choses sont impliquées: l'emplacement qui est le stockage et la valeur. La signification de la durée de vie et de stockage est similaire; Mais la durée est plus visible du point de vue de l'emplacement que du point de vue de la valeur. La durée de stockage est l'heure à partir duquel un emplacement est associé à un objet au moment où l'emplacement est dissocié de l'objet.

Le reste de cet article illustre la durée de vie de l'objet et explique brièvement les différentes durées de stockage. Vous devriez avoir des connaissances de base en C ++ afin de comprendre cet article. Vous devriez également avoir des connaissances dans la portée C ++.

Contenu de l'article

  • Illustration de la durée de vie des objets
  • Durée de stockage
  • Durée de stockage automatique
  • Durée de stockage dynamique
  • Durée de stockage statique
  • Durée de stockage du thread
  • Conclusion

Illustration de la durée de vie des objets

Considérez le programme suivant:

#inclure
Utilisation de Namespace Std;
int main()

si (1 == 1)

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

retour 0;

La sortie est, 1A .

La vie d'un objet prend fin, quand elle sort de portée. La durée de vie de l'objet x, commence à «x = 1;» et se termine à la fin du scope if-local. La durée de vie de l'objet y commence à «y = 'a»; » et se termine à la fin du scope if-local. Avant que les deux objets ne meurent, ils sont employés dans la déclaration COUT .

Durée de stockage

La durée de stockage est déterminée par l'un des schémas suivants: Durée de stockage automatique; durée de stockage dynamique; durée de stockage statique; durée de stockage du thread. Catégories de durée de stockage, s'appliquent également aux références.

Durée de stockage automatique

Si une variable n'est pas déclarée explicitement comme statique, thread_local ou externe, cette variable a une durée de stockage automatique. Les exemples sont X et Y ci-dessus. La durée de ces variables se termine lorsqu'ils sortent de la portée. Le programme suivant illustre la durée automatique du stockage pour une référence et un pointeur, dans la portée globale.

#inclure
Utilisation de Namespace Std;
int x = 1;
int & m = x;
char y = 'a';
char * n = & y;
int main()

couter << m << *n << '\n';
retour 0;

La sortie est, 1A .

La durée de m commence à partir de «int & m = x;» et se termine à la fin du programme. La durée de N commence à partir de «char * n = & y;» et se termine à la fin du programme.

Durée de stockage dynamique

Magasin gratuit

Dans un ordinateur moderne, plus d'un programme peut fonctionner en même temps. Chaque programme a sa propre partie de la mémoire. Le reste de la mémoire qui n'est utilisé par aucun programme, est connu sous le nom de magasin gratuit. L'expression suivante est utilisée pour retourner un emplacement pour un entier dans le magasin gratuit

Nouveau Int

Cet emplacement (stockage) pour l'entier, retourné, doit toujours être identifié par affectation à un pointeur. Le code suivant illustre comment utiliser le pointeur avec un magasin gratuit:

int * ptrint = new int;
* ptrint = 12;
couter<< *ptrInt <<'\n';

La sortie est 12 .

Pour mettre fin à la durée de vie de l'objet, utilisez l'expression de suppression comme suit:

supprimer des ptrints;

L'argument pour l'expression de suppression est un pointeur. Le code suivant illustre son utilisation:

int * ptrint = new int;
* ptrint = 12;
supprimer des ptrints;

Un pointeur créé avec la nouvelle expression et supprimé avec l'expression de suppression, est d'une durée de stockage dynamique. Ce pointeur meurt au fur et à mesure de sa portée, ou est supprimé. La durée de l'objet dans le code précédent commence à «* ptrint = 12;» et se termine à la fin de la région déclarative (portée). Il y a plus dans les expressions nouvelles et supprimées que ce qui a été discuté ici - voir plus tard.

Durée de stockage statique

Objet statique

Un objet déclaré statique, se comporte comme l'objet ordinaire, sauf que sa durée de stockage commence à partir du moment où il est initialisé à la fin du programme. Il ne peut pas être vu en dehors de sa portée, mais il peut indirectement être utilisé de l'extérieur de sa portée.

Considérez le programme suivant, qui est censé compter de 1 à 5 (ne pas tester le programme):

#inclure
Utilisation de Namespace Std;
int fn ()

int stc = 1;
couter << " << stc;
stc = stc + 1;
if (stc> 5)
retour 0;
fn ();

int main()

fn ();
retour 0;

La sortie est 1 1 1 1 1 1 1 1… et ne terminait jamais vraiment. La définition de la fonction est une fonction récurrente; ce qui signifie qu'il continue de s'appeler jusqu'à ce qu'une condition soit remplie.

La solution consiste à rendre l'objet STC statique. Une fois qu'un objet statique a été initialisé, sa valeur ne peut pas être modifiée jusqu'à la fin du programme. Le programme suivant (que vous pouvez tester), qui est le même que ce qui précède, mais maintenant avec STC, rendu statique, compte de 1 à 5:

#inclure
Utilisation de Namespace Std;
int fn ()

static int stc = 1;
couter << " << stc;
stc = stc + 1;
if (stc> 5)
retour 0;
fn ();

int main()

fn ();
retour 0;

La sortie est: 1 2 3 4 5 .

Remarque: la durée d'un objet statique commence lorsque l'objet a été initialisé et se termine à la fin du programme. En attendant, l'objet peut être utilisé indirectement, à partir d'une portée différente. Une fois qu'un objet statique a été initialisé, sa valeur initiale ne peut pas être modifiée, même si sa définition est réévaluée. Dans le code ci-dessus, le STC n'est pas réinitialisé, la prochaine fois qu'il sera appelé. La prochaine fois qu'il sera appelé, il est incrémenté par «STC = STC + 1;».

Membre de données statique

Un ensemble de variables et de fonction connexes peut être placée dans une unité généralisée appelée classe. Si les variables reçoivent des valeurs particulières, la classe devient un objet. Cependant, un objet n'est pas créé en attribuant simplement des valeurs à la variable. La classe est instanciée pour obtenir un objet; Et chaque objet créé a son propre nom différent des autres objets de la même classe. Le programme suivant montre une classe, appelée TheCla et un objet, appelé OBJ; Il montre également comment l'objet est instancié et utilisé dans la fonction principale ():

#inclure
Utilisation de Namespace Std;
classe TheCla

public:
int num;
void func (char cha, const char * str)
couter << "There are " <<
nobs << " books worth " <<
cha << str << " in the store." << '\n';

;
int main()

Thecla obj;
obj.num = 12;
obj.func ('$', "500");
retour 0;

La sortie est:

Il y a 12 livres d'une valeur de 500 $ dans le magasin.

Remarquez que pour attribuer la valeur de 12 à la variable Num, l'objet doit être instancié, avant que l'affectation puisse avoir lieu. Il est possible pour le programmeur d'attribuer la valeur sans instancier (créant) un objet. Pour y parvenir, la variable, num devra être déclarée statique. Ensuite, il sera accessible comme «thecla :: num» sans le nom de l'objet, mais avec le nom de classe. Le programme suivant illustre ceci:

#inclure
Utilisation de Namespace Std;
classe TheCla

public:
const statique int int num = 12;
void func (char cha, const char * str)
couter << "There are " << num <<
"Les livres valent" << cha << str <<
" dans le magasin." << '\n';

;
int main()

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

La sortie est:

12
Il y a 12 livres d'une valeur de 500 $ dans le magasin.

Notez que pour accéder au membre de données, num dans main (), l'opérateur de résolution de portée, :: a dû être utilisé. Pas non plus que la variable, NUM devait être rendue constante et initialisée dans la description de la classe (définition).

Fonction de membre statique

Remarquez que dans la liste des programmes précédents ci-dessus, afin d'utiliser la fonction FUNC dans Main (), un objet devait être instancié. Il est possible pour le programmeur d'appeler la fonction sans instancier (créer) un objet. Pour y parvenir, la définition de la fonction doit être précédée du mot «statique». Ensuite, il sera accessible comme «thecla :: func ()» sans le nom de l'objet, mais avec le nom de la classe. Le programme suivant l'illustre pour les membres de données statiques et la fonction des membres statiques:

#inclure
Utilisation de Namespace Std;
classe TheCla

public:
const statique int int num = 12;
STATIC VOID FUNC (Char Cha, const char * str)
couter << "There are " << num <<
"Les livres valent" << cha << str <<
" dans le magasin." << '\n';

;
int main()

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

La sortie est:

Il y a 12 livres d'une valeur de 500 $ dans le magasin.

Durée de stockage du thread

Le thread comme une fonctionnalité en C ++, n'a pas encore été implémenté par le compilateur G ++. Ainsi, au lieu d'expliquer cela, la citation de la spécification C ++ est donnée comme suit:

  1. Toutes les variables déclarées avec le mot clé Thread_Local ont une durée de stockage de thread. Le stockage de ces entités durera la durée du fil dans lequel ils sont créés. Il y a un objet ou une référence distincte par thread, et l'utilisation du nom déclaré fait référence à l'entité associée au thread actuel.
  2. Une variable avec durée de stockage de thread doit être initialisée avant sa première utilisation ODR et, si elle est construite, doit être détruite à la sortie du fil."

Conclusion

La durée de vie d'un objet commence lorsque son initialisation est terminée et se termine lorsque son stockage est libéré. La durée de stockage dynamique démarre lorsque le stockage créé par (nouveau type) est initialisé et se termine lorsque l'objet sort de portée ou est supprimé par «Supprimer le pointeur». La durée d'un objet statique commence lorsque l'objet a été initialisé et se termine à la fin du programme. Une fois qu'un objet statique a été initialisé, sa valeur initiale ne peut pas être modifiée, même si sa définition est réévaluée. Les membres de données statiques et les membres de la fonction statique sont accessibles en dehors de la description de la classe avec «ClassName :: Nom».