Accueil Finances personnelles Comment le tas fonctionne en C ++ - les mannequins

Comment le tas fonctionne en C ++ - les mannequins

Table des matières:

Vidéo: Langage C #17 - piles 2024

Vidéo: Langage C #17 - piles 2024
Anonim

Le tas est un bloc de mémoire amorphe auquel votre programme C ++ peut accéder si nécessaire. Découvrez pourquoi il existe et comment l'utiliser.

Tout comme il est possible de passer un pointeur sur une fonction, il est possible qu'une fonction renvoie un pointeur. Une fonction qui renvoie l'adresse d'un double est déclarée comme suit:

double * fn (void);

Cependant, vous devez être très prudent lorsque vous renvoyez un pointeur. Pour comprendre les dangers, vous devez savoir quelque chose sur la portée variable.

Portée limitée en C ++

Scope est la plage sur laquelle une variable est définie. Considérons l'extrait de code suivant:

// la variable suivante est accessible // à toutes les fonctions et définie tant que // le programme est en cours d'exécution (portée globale) int intGlobal; // la variable suivante intChild est accessible // uniquement à la fonction et est définie uniquement // tant que C ++ exécute child () ou // une fonction qui child () appelle (scope de fonction) void child (void) {int intChild;} // la variable suivante intParent a la fonction // portée void parent (void) {int intParent = 0; enfant(); int intLater = 0; intParent = intLater;} int main (int nArgs, char * pArgs []) {parent ();}

Ce fragment de programme commence par la déclaration d'une variable intGlobal. Cette variable existe à partir du moment où le programme commence à s'exécuter jusqu'à ce qu'il se termine. Vous dites que intGlobal "a une portée de programme. "Vous dites aussi que la variable" entre dans le champ "avant même que la fonction main () ne soit appelée.

La fonction main () appelle immédiatement parent (). La première chose que le processeur voit dans parent () est la déclaration de intParent. À ce stade, intParent entre dans la portée, c'est-à-dire que intParent est défini et disponible pour le reste de la fonction parent ().

La deuxième déclaration dans parent () est l'appel à child (). Encore une fois, la fonction child () déclare une variable locale, cette fois intChild. La portée de la variable intChild est limitée à la fonction child (). Techniquement, intParent n'est pas défini dans la portée de child () car child () n'a pas accès à intParent; cependant, la variable intParent continue d'exister pendant l'exécution de child ().

Quand exit () sort, la variable intChild est hors de portée. IntChild n'est plus seulement accessible, il n'existe plus. (La mémoire occupée par intChild est renvoyée dans le pool général pour être utilisée pour d'autres choses.)

Comme parent () continue à s'exécuter, la variable intLater entre dans la portée de la déclaration. Au moment où parent () retourne à main (), intParent et intLater sortent de la portée.

Comme intGlobal est déclaré globalement dans cet exemple, il est disponible pour les trois fonctions et reste disponible pendant toute la durée du programme.

Examen du problème d'étendue en C ++

Le segment de code suivant compile sans erreur mais ne fonctionne pas (ne détestez-vous pas ça?):

double * enfant (void) {double dLocalVariable; return & dLocalVariable;} void parent (void) {double * pdLocal; pdLocal = enfant (); * pdLocal = 1. 0;}

Le problème avec cette fonction est que dLocalVariable est défini uniquement dans la portée de la fonction child (). Ainsi, au moment où l'adresse mémoire de dLocalVariable est retournée par child (), elle fait référence à une variable qui n'existe plus. La mémoire que dLocalVariable occupait autrefois est probablement utilisée pour autre chose.

Cette erreur est très courante car elle peut se glisser de plusieurs façons. Malheureusement, cette erreur n'entraîne pas l'arrêt immédiat du programme. En fait, le programme peut fonctionner correctement la plupart du temps, c'est-à-dire que le programme continue à fonctionner tant que la mémoire précédemment occupée par dLocalVariable n'est pas réutilisée immédiatement. De tels problèmes intermittents sont les plus difficiles à résoudre.

Fournir une solution en utilisant le tas dans C ++

Le problème de portée est dû au fait que C ++ a récupéré la mémoire définie localement avant que le programmeur soit prêt. Ce dont on a besoin, c'est d'un bloc de mémoire contrôlé par le programmeur. Elle peut allouer la mémoire et la remettre quand elle le veut - pas parce que C ++ pense que c'est une bonne idée. Un tel bloc de mémoire s'appelle le tas.

La mémoire de tas est allouée en utilisant le nouveau mot-clé suivi du type d'objet à allouer. La nouvelle commande casse un morceau de mémoire du tas assez grand pour contenir le type d'objet spécifié et renvoie son adresse. Par exemple, le texte suivant attribue une variable double au tas:

double * enfant (void) {double * pdLocalVariable = new double; return pdLocalVariable;}

Cette fonction fonctionne maintenant correctement. Bien que la variable pdLocalVariable soit hors de portée lorsque la fonction child () renvoie, la mémoire à laquelle pdLocalVariable fait référence ne l'est pas. Un emplacement de mémoire retourné par new ne sort pas de sa portée tant qu'il n'est pas explicitement retourné au tas en utilisant le mot-clé delete, qui est spécifiquement conçu pour cela:

void parent (void) {// child () retourne l'adresse d'un bloc // de la mémoire de tas double * pdMyDouble = child (); // stocke une valeur ici * pdMyDouble = 1. 1; // … // retourne maintenant la mémoire sur le tas. Delete pdMyDouble; pdMyDouble = 0; // …}

Ici, le pointeur retourné par child () est utilisé pour stocker une valeur double. Une fois la fonction terminée avec l'emplacement de la mémoire, elle est renvoyée dans le tas. La fonction parent () met le pointeur à 0 après que la mémoire de tas a été retournée - ce n'est pas une exigence, mais c'est une très bonne idée.

Si le programmeur tente par erreur de stocker quelque chose dans * pdMyDouble après la suppression, le programme se bloque immédiatement avec un message d'erreur significatif.

Vous pouvez aussi utiliser new pour allouer des tableaux du tas, mais vous devez retourner un tableau en utilisant le mot-clé delete []:

int * nArray = new int [10]; nArray [0] = 0; delete [] nArray;

Techniquement nouveau int [10] invoque le nouvel opérateur [] mais il fonctionne de la même manière que le nouveau.

Comment le tas fonctionne en C ++ - les mannequins

Le choix des éditeurs

Installation des périphériques réseau Juniper dans un rack - mannequins

Installation des périphériques réseau Juniper dans un rack - mannequins

Première étape de l'utilisation de tout périphérique réseau implique l'installation du matériel et des logiciels nécessaires à son fonctionnement. Les périphériques qui exécutent le système d'exploitation Junos varient en taille et en forme: très petits (commutateurs avec seulement quelques ports fonctionnant sur un courant de bureau normal) ou massifs (routeurs centraux multi-rack nécessitant plusieurs installateurs expérimentés ...

Comment gérer les fichiers journaux des périphériques Junos - dummies

Comment gérer les fichiers journaux des périphériques Junos - dummies

Si vous avez créé des fichiers journaux volumineux types d'événements à différents types de fichiers pour la facilité d'utilisation, vous devez gérer ces fichiers. Par défaut, le logiciel Junos OS limite la taille des fichiers journaux à 128 Ko. Lorsque les événements sont consignés, lorsque la taille totale des messages dépasse 128 Ko, quelque chose ...

Le choix des éditeurs

Adolescents gais: sortir avec la famille et les amis - les mannequins

Adolescents gais: sortir avec la famille et les amis - les mannequins

Qui révèlent l'homosexualité n'est jamais facile - pour jeunes ou vieux - mais le processus peut être particulièrement difficile pour les adolescents, qui sont dépendants de leur famille et n'ont pas encore établi leur propre vie privée avec leur propre lieu de vie et un emploi pour fournir un soutien financier. En fait, les taux de suicide ...

Comment Implanon fonctionne comme contrôle des naissances - les nuls

Comment Implanon fonctionne comme contrôle des naissances - les nuls

Certaines femmes choisissent Implanon comme contraceptif parce qu'elles veulent un contraceptif Cela ne nécessite pas de maintenance quotidienne, ni même saisonnière, ni de stérilisation. Implanon est une bonne option pour ces femmes parce que le dispositif est implanté sous la peau du bras d'une femme et est efficace pendant jusqu'à trois ans. Avec ...

Comment la grossesse change votre corps et votre vie sexuelle - les nuls

Comment la grossesse change votre corps et votre vie sexuelle - les nuls

Peuvent certainement faire partie d'une vie sexuelle saine les neuf mois de grossesse. Cela dit, ce ne sera probablement plus pareil qu'auparavant. Le corps d'une femme change au cours de cette période, tout comme ses besoins. La meilleure façon d'avoir des rapports sexuels durant la grossesse est de comprendre comment le corps d'une femme change pendant ...

Le choix des éditeurs

Utiliser une structure de répertoires peu profonds pour de meilleurs résultats de moteur de recherche - mannequins

Utiliser une structure de répertoires peu profonds pour de meilleurs résultats de moteur de recherche - mannequins

Structure de répertoire pour votre site Web, il est important de ne pas aller trop loin - cela garantit que les moteurs de recherche peuvent plus facilement votre site et que les utilisateurs trouveront votre site plus accessible. La structure du répertoire fait référence à l'emplacement physique de vos fichiers dans les dossiers du site. Par exemple, ...

Comprendre les avantages des requêtes à longue queue pour le SEO - Les nuls

Comprendre les avantages des requêtes à longue queue pour le SEO - Les nuls

Stratégie de référencement pour attirer beaucoup de monde sur votre site. Mais vous ne voulez pas seulement de la quantité - vous voulez du trafic de qualité. Vous voulez attirer des visiteurs qui viennent et restent un moment et trouvent ce qu'ils recherchent sur votre site. Ce dont vous avez vraiment besoin, ce sont les clients. Dans le monde de ...

Services de syndication traditionnels et flux RSS pour le contenu SEO - dummies

Services de syndication traditionnels et flux RSS pour le contenu SEO - dummies

Certains services de syndication vendent du contenu pour votre site web. Ce contenu est souvent envoyé à des sites Web utilisant des flux RSS. La syndication de contenu n'a rien de nouveau. Une grande partie de ce que vous lisez dans votre journal local n'est pas écrite par le personnel du journal; Cela vient d'un service de syndication. En général, ce matériel devrait être meilleur que le contenu syndiqué gratuit. Cependant, ...