Comment travailler avec l'allocation de mémoire dynamique C ++?



Cet article explore l'allocation dynamique de mémoire en C ++, une fonctionnalité importante qui vous permet de prendre en compte vos besoins en mémoire pour les ressources en temps réel.

L'allocation de mémoire dynamique en C ++ est une fonctionnalité très importante qui vous permet de prendre en compte vos besoins pour faire face au besoin de ressources en temps réel. Dans cet article, nous explorerions Exploration en détail. Les pointeurs suivants seront traités dans cet article,

Commençons donc par cet article sur l'allocation dynamique de mémoire en C ++





Besoin d'allocation de mémoire dynamique?

Disons que nous voulons saisir une phrase sous forme de tableau de caractères, mais nous ne sommes pas sûrs du nombre exact de caractères requis dans le tableau.

Maintenant, lors de la déclaration du tableau de caractères, si nous spécifions sa taille inférieure à la taille de la chaîne souhaitée, alors nous obtiendrons une erreur car l'espace dans la mémoire allouée au tableau est moindre par rapport à la taille de la chaîne d'entrée. Si nous spécifions sa taille plus grande que la taille de la chaîne d'entrée, alors le tableau se verra allouer un espace dans la mémoire qui est beaucoup plus grand que la taille de la chaîne désirée, consommant ainsi inutilement plus de mémoire même lorsque cela n'est pas nécessaire.



Dans le cas ci-dessus, nous n'avons aucune idée de la taille exacte du tableau avant la compilation (lorsque l'ordinateur compile le code et que la chaîne est saisie par l'utilisateur). Dans de tels cas, nous utilisons le Nouveau opérateur.

C ++ définit deux opérateurs unaires Nouveau et effacer qui effectuent la tâche d'allocation et de désallocation de la mémoire pendant l'exécution. Étant donné que ces opérateurs (new et delete) fonctionnent sur la mémoire de stockage libre (mémoire de tas), ils sont également appelés opérateur de stockage libre. Les pointeurs fournissent le support nécessaire pour le système d'allocation de mémoire dynamique en C ++.

Avec l'aide de l'allocation dynamique, un programme peut obtenir de la mémoire pendant l'exécution.



Les variables globales et locales sont allouées à la mémoire pendant la compilation. Cependant, nous ne pouvons pas ajouter de variables globales ou locales pendant l'exécution. Si le programme a besoin d'utiliser une quantité variable de mémoire, nous aurions besoin d'allouer de la mémoire pendant l'exécution, au fur et à mesure des besoins. Et bien sûr, ici, les routines d'allocation dynamique peuvent servir cet objectif.

Différences entre l'allocation de mémoire statique et l'allocation de mémoire dynamique:

Il s'agit d'une architecture de mémoire de base utilisée pour tout programme C ++:

Mémoire - Allocation dynamique de mémoire - Edureka

Nous aurons besoin d'une image comme celle-ci

La pile est utilisée pour l’allocation de mémoire statique et le tas pour l’allocation de mémoire dynamique, les deux étant stockés dans la RAM de l’ordinateur.

Les variables qui sont allouées sur la pile tandis que l'allocation de mémoire statique est stockée directement dans la mémoire et l'accès à cette mémoire est très rapide, également son allocation est traitée lorsque le programme est compilé. Lorsqu'une fonction ou une méthode appelle une autre fonction qui pourrait à son tour appeler une autre fonction et ainsi de suite, l'exécution de toutes ces fonctions reste suspendue jusqu'à ce que la toute dernière fonction renvoie sa valeur. La pile est toujours stockée dans un ordre LIFO (dernier entré premier sorti), le bloc le plus récemment réservé est toujours le bloc suivant à libérer. Cela permet de garder une trace de la pile, libérer un bloc de la pile n'est rien de plus que d'ajuster un pointeur.

Les variables allouées sur le tas ont leur mémoire allouée au moment de l'exécution pendant l'allocation de mémoire dynamique. L'accès à cette mémoire est un peu plus lent par rapport à la pile, mais la taille du tas n'est limitée que par la taille de la mémoire virtuelle. L'élément du tas n'a pas de dépendances les uns avec les autres et est toujours accessible de manière aléatoire à tout moment. Nous pouvons allouer un bloc à tout moment et le libérer à tout moment. Cela rend difficile le suivi des parties du tas allouées ou désallouées à un moment donné.

Passer à cet article sur l'allocation dynamique de mémoire en C ++

Allocation de mémoire en utilisant Nouveau Mot-clé

En C ++, le Nouveau L'opérateur est utilisé pour allouer de la mémoire lors de l'exécution et la mémoire est allouée en octets. La Nouveau L'opérateur désigne une demande d'allocation de mémoire dynamique sur le tas. Si suffisamment de mémoire est disponible, le Nouveau L'opérateur initialise la mémoire et renvoie l'adresse de la mémoire nouvellement allouée et initialisée à la variable pointeur.

Syntaxe:

datatype * pointer_name = nouveau type de données

Exemple:

int * ptr = new int // Nous pouvons déclarer une variable lors de l'allocation dynamique des deux manières suivantes. int * ptr = new int (10) int * ptr = new int {15} // new opérateur est également utilisé pour allouer un bloc (un tableau) de mémoire de type data-type. int * ptr = new int [20] // L'instruction ci-dessus alloue dynamiquement de la mémoire pour 20 entiers en continu de type int et renvoie un pointeur vers le premier élément de la séquence vers le pointeur «ptr».

Remarque : Si le tas n'a pas assez de mémoire à allouer, la nouvelle requête indique l'échec en lançant une exception std :: bad_alloc, sauf si «nothrow» est utilisé avec l'opérateur new, auquel cas elle renvoie un pointeur NULL. Par conséquent, il est recommandé de vérifier la variable de pointeur produite par new avant de l'utiliser dans le programme.

Passer à cet article sur l'allocation dynamique de mémoire en C ++

Désallocation de la mémoire à l'aide effacer Mot-clé:

Une fois que la mémoire du tas est allouée à une variable ou à un objet de classe à l'aide du Nouveau , nous pouvons désallouer cet espace mémoire en utilisant le effacer mot-clé.

algorithmes java et structures de données

Syntaxe:

delete pointer_variable // Ici, pointer_variable est le pointeur qui pointe vers l'objet de données créé par new. delete [] pointer_variable // Pour libérer la mémoire de tableau allouée dynamiquement pointée par pointer-variable, nous utilisons la forme suivante de suppression:

Exemple:

supprimer ptr supprimer [] ptr

Remarque : L'étendue de l'objet ou la durée de vie de l'objet est le temps pendant lequel l'objet reste en mémoire pendant l'exécution du programme. L'allocation de mémoire de tas est plus lente qu'une pile, car, dans le tas, il n'y a pas d'ordre particulier dans lequel vous pouvez allouer de la mémoire alors que dans la pile, elle suit LIFO.

Passer à cet article sur l'allocation dynamique de mémoire en C ++

Allocation dynamique de tableaux

L'utilisation principale du concept d'allocation de mémoire dynamique est d'allouer de la mémoire à un tableau lorsque nous devons le déclarer en spécifiant sa taille mais n'en sommes pas sûrs.

Voyons, un exemple pour comprendre son utilisation.

#include en utilisant l'espace de noms std int main () {int len, sum = 0 cout<< 'Enter the no. of students in the class' <>len int * marks = new int [len] // Cout d'allocation de mémoire dynamique<< 'Enter the marks of each student' << endl for( int i = 0 i>* (marques + i)} pour (int i = 0 i

Explication:
Dans cet exemple, nous demandons d'abord à l'utilisateur le nombre d'élèves dans une classe et nous stockons sa valeur dans la variable len. Ensuite, nous déclarons un tableau d'entiers et lui allouons un espace en mémoire dynamiquement égal à la valeur stockée dans la variable len en utilisant cette instruction int * marks = new int [length] ainsi on lui alloue un espace égal à 'length * (size of 1 entier)'. Le reste du code est explicite.

Passer à cet article sur l'allocation dynamique de mémoire en C ++

Allocation de mémoire dynamique pour les objets

Nous pouvons également allouer dynamiquement des objets.

Comme nous savons que Constructor est une fonction membre de classe spéciale utilisée pour initialiser un objet et Destructor est également une fonction membre de classe qui est appelée chaque fois que l'objet sort de la portée.

Destructor peut être utilisé pour libérer la mémoire affectée à l'objet. Il est appelé dans les conditions suivantes.

  • Lorsqu'un objet local est hors de portée
  • Pour un objet global, lorsqu'un opérateur est appliqué à un pointeur vers l'objet de la classe

Nous pouvons à nouveau utiliser des pointeurs tout en allouant dynamiquement de la mémoire aux objets.

étiquette goto c ++

Voyons un exemple de tableau d’objets.

#include en utilisant l'espace de noms classe std Random {public: Random () {cout<< 'Constructor' << endl } ~Random() { cout << 'Destructor' << endl } } int main() { Random* a = new Random[3] delete [] a // Delete array return 0 } 

Production:

Explication:

Le constructeur sera appelé trois fois puisque nous allouons de la mémoire à trois objets de la classe Random. Le destructeur sera également appelé trois fois au cours de chacun de ces objets. «Random * a = new Random [3]», cette déclaration est responsable de l’allocation dynamique de la mémoire de notre objet.

Nous sommes donc arrivés à la fin de cet article sur «Dynamic Memory Allocation C ++». Si vous souhaitez en savoir plus, consultez le par Edureka, une entreprise d'apprentissage en ligne de confiance. Le cours de formation et de certification Java J2EE et SOA d'Edureka est conçu pour vous former aux concepts Java de base et avancés ainsi qu'à divers frameworks Java tels que Hibernate et Spring.

Vous avez une question pour nous? Veuillez le mentionner dans la section commentaires de ce blog et nous vous répondrons dans les plus brefs délais.