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 2025

Vidéo: Langage C #17 - piles 2025
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

Comment envoyer une vidéo et des photos avec Flip Video - Dummies

Comment envoyer une vidéo et des photos avec Flip Video - Dummies

Après avoir pris photos et vidéos d'événements dans votre vie avec votre caméra Flip Video, vous pouvez les envoyer par e-mail à vos amis et aux membres de votre famille. Le partage de films et d'images que vous capturez et créez en envoyant un message e-mail vous permet de toucher et de toucher quelqu'un avec vos créations, même si vous êtes à proximité ...

Comment enregistrer le son séparément pour votre film numérique - Les mannequins

Comment enregistrer le son séparément pour votre film numérique - Les mannequins

Ont parfois besoin d'un réalisateur enregistrer le son en utilisant un appareil séparé de l'appareil photo, enregistrer le son séparément, puis synchroniser le son sur la vidéo plus tard, lors de l'édition. Habituellement, la raison en est d'augmenter la qualité du son enregistré car de nombreuses caméras n'enregistrent pas le son aussi bien que ...

Comment enregistrer une vidéo avec un caméscope Flip - Les nuls

Comment enregistrer une vidéo avec un caméscope Flip - Les nuls

Enregistrant des vidéos avec votre caméra Flip est comme facile comme 1-2-3 (et 4). Avant d'enregistrer une vidéo, vérifiez les indicateurs d'état de votre Flip pour vous assurer que votre caméra est complètement chargée et qu'elle a suffisamment de temps d'enregistrement pour capturer la vidéo que vous voulez filmer. Pour vérifier le niveau de charge de la batterie de votre Flip (ou ...

Le choix des éditeurs

Mot Raccourcis des symboles 2016 - des mannequins

Mot Raccourcis des symboles 2016 - des mannequins

Dans Word 2016 vous pouvez insérer des symboles communs en utilisant ces raccourcis clavier. Utilisez ces raccourcis clavier au lieu de la commande Insérer → Symbole pour insérer des symboles typographiques communs. Symbole Raccourci Tableau de bord Alt + Ctrl + signe moins En tableau Ctrl + signe moins Copyright Alt + Ctrl + C Marque déposée Alt + Ctrl + R Marque Alt + Ctrl + T Ellipsis Alt + Ctrl + période

Mot Raccourcis des symboles 2016 - mannequins

Mot Raccourcis des symboles 2016 - mannequins

En fonction de la manière dont vous choisissez d'utiliser Word 2016, vous risquez de devoir faire face pour un symbole spécial. Avec ces raccourcis clavier, vous pouvez insérer des symboles communs dans Word 2016. Utilisez ces raccourcis clavier au lieu de la commande Insérer → Symbole pour insérer des symboles typographiques communs. Symbole Raccourci Tableau de bord Alt + Ctrl + signe moins En tiret ...

Mot Trucs et astuces pour les tables 2013 - mannequins

Mot Trucs et astuces pour les tables 2013 - mannequins

Dans Word 2013, le texte se déverse dans un tableau sur une cellule base de la cellule. Vous pouvez taper un mot, une phrase ou même un paragraphe. Tout ce texte reste dans la cellule, bien que la cellule change de taille pour accueillir de plus grandes quantités de texte. Vous pouvez mettre en forme la cellule d'une table comme n'importe quel paragraphe de Word, en ajoutant même des marges ...

Le choix des éditeurs

Sexe For Dummies Cheat Sheet - les nuls

Sexe For Dummies Cheat Sheet - les nuls

Que vous vous considériez comme un Don Juan, une Lady Chatterly, ou un novice sexuel , tout le monde peut tirer le meilleur parti du sexe avec un peu plus de connaissances. Vous devriez savoir que les préliminaires sont quelque chose que vous devriez prendre en considération avec chaque interaction que vous et votre partenaire avez, ainsi que la façon de garder les choses ...

Mots et significations liés à la ménopause - mannequins

Mots et significations liés à la ménopause - mannequins

Bien que ce soit loin d'être une liste complète des termes que vous pourriez entendre être utilisé lorsque la ménopause est discutée, les cinq termes essentiels suivants devraient vous aider à comprendre les bases. HRT (hormonothérapie substitutive): Un traitement pour compléter les hormones que vous perdez pendant la ménopause - généralement une combinaison d'œstrogènes, ...

Symptômes qui indiquent que la ménopause est proche - mannequins

Symptômes qui indiquent que la ménopause est proche - mannequins

La plupart des femmes commencent à éprouver des symptômes de ménopause déséquilibrés, alors qu'ils ont encore des règles. Si vous ressentez un ou plusieurs des symptômes suivants, consultez votre médecin - vous pouvez être en train d'aborder le changement. Peau sèche ou cheveux Pensée floue (difficulté à se concentrer) Flutters du cœur (battements de cœur rapides) ...