Comment supprimer un tableau bidimensionnel en C ++

Comment supprimer un tableau bidimensionnel en C ++
Un tableau 2D peut être créé de deux manières: utiliser la mémoire normale ou utiliser le magasin gratuit. Lorsqu'un programme est en cours d'exécution, il a sa partie normale de la mémoire et de la mémoire supplémentaire à utiliser. Le programme n'est pas obligé d'utiliser la mémoire supplémentaire appelée magasin gratuit. Le programme créerait un tableau 2D ordinaire en mémoire normale. Si le programme veut créer le même tableau 2D dans le magasin gratuit, il devrait le faire dynamiquement. Les syntaxes pour créer le tableau bidimensionnel dans les deux types de mémoire sont différents. Pour supprimer un tableau 2D ordinaire, laissez-le sortir de la portée. Pour supprimer un tableau 2D, créé dans un magasin gratuit, utilisez l'opérateur de suppression de manière appropriée.

Création d'un tableau 2D ordinaire

La déclaration suivante crée un tableau 2D ordinaire:

String arr2d [] [5] = "aa", "ab", "ac", "ad", "ae",
"Ba", "bb", "bc", "bd", "be",
"CA", "CB", "CC", "CD", "CE",
"Da", "db", "dc", "dd", "de",
"Ea", "eb", "ec", "ed", "ee";

Si ce tableau est créé dans la portée globale, il ne peut pas être utilisé (e.g. réaffecté une valeur d'élément) dans la portée globale. Cependant, il peut faire en sorte que l'un de ses éléments réaffecte une valeur dans les autres portées.

Pour supprimer ce tableau, laissez-le sortir de la portée. S'il était créé dans une portée autre que la portée globale, il sortirait de la portée à la fin de son bloc (). S'il était créé dans la portée mondiale, il ne ferait que de la portée à la fin du programme.

Tableau 2D de magasin gratuit

L'instruction suivante montre comment le tableau ci-dessus mais avec un nom de pointeur différent peut être créé dynamiquement dans le magasin gratuit:

String (* ptr2d) [5] = new String [5] [5] "aa", "ab", "ac", "ad", "ae",
"Ba", "bb", "bc", "bd", "be",
"CA", "CB", "CC", "CD", "CE",
"Da", "db", "dc", "dd", "de",
"Ea", "eb", "ec", "ed", "ee";

Notez comment le tableau 2D a été créé avec le nouvel opérateur. Le nom du tableau, est ptr2d.

Si ce tableau est créé dans la portée globale, il ne peut pas être utilisé (e.g. réaffecté une valeur d'élément) dans la portée globale. Cependant, il peut avoir l'un de ses éléments, réaffecté une valeur dans les autres portées.

Pour supprimer ce tableau, utilisez l'opérateur de suppression [], comme indiqué ci-dessous. Le tableau dans le magasin gratuit ne peut pas vraiment être supprimé en le laissant sortir de la portée. Il doit être supprimé avec l'opérateur de suppression [], dans sa portée, afin de libérer de la mémoire.

Contenu de l'article

- Introduction - Voir ci-dessus

- Suppression d'un tableau ordinaire 2D

- Suppression du tableau de pointeur 2D créé dynamiquement en magasin gratuit

- Conclusion

Suppression d'un tableau ordinaire 2D

Un tableau ordinaire bidimensionnel est supprimé en le laissant simplement sortir de la portée. Le programme suivant l'illustre avec une portée imbriquée:

#inclure
Utilisation de Namespace Std;
int main()

if (1 == 1)
String arr2d [] [5] = "aa", "ab", "ac", "ad", "ae",
"Ba", "bb", "bc", "bd", "be",
"CA", "CB", "CC", "CD", "CE",
"Da", "db", "dc", "dd", "de",
"Ea", "eb", "ec", "ed", "ee";
couter<< arr2D[1][1] <
// cout<< arr2D[1][1] <retour 0;

La sortie est, bb. L'IF-Construct a un bloc qui est la portée imbriquée. Le tableau s'arrête existant à la fin du bloc. Il y a un indicateur de commentaires, juste en dessous du bloc, dans le programme. S'il est supprimé, le programme ne se compile pas et un message d'erreur sera émis. Cela résulte du fait que le tableau 2D est mort à la fin du bloc.

Dans le programme suivant, le tableau 2D ordinaire déclaré dans le corps de fonction, décède à la fin du bloc fonction:

#inclure
Utilisation de Namespace Std;
void fn ()
String arr2d [] [5] = "aa", "ab", "ac", "ad", "ae",
"Ba", "bb", "bc", "bd", "be",
"CA", "CB", "CC", "CD", "CE",
"Da", "db", "dc", "dd", "de",
"Ea", "eb", "ec", "ed", "ee";
couter<< arr2D[1][1] <
// cout<< arr2D[1][1] <int main()

fn ();
retour 0;

La sortie est toujours, BB. Il y a un indicateur de commentaire juste en dessous du bloc fonction du programme. S'il est supprimé, le programme ne se compile pas et un message d'erreur sera émis. Cela résulte du fait que le tableau 2D est mort à la fin du bloc. Rappelez-vous également que l'attribution d'une valeur à un élément 2D, après déclaration, n'est pas autorisée dans la portée globale.

Suppression du tableau de pointeur 2D créé dynamiquement en magasin gratuit

Affectation après la déclaration n'est pas autorisée dans la portée mondiale. Ainsi, il est pratique d'avoir une déclaration de tableau 2D, dans une portée imbriquée, dans la fonction principale C ++, pour des raisons pédagogiques.

Un tableau bidimensionnel, déclaré dans la forme ci-dessus, est supprimé avec la syntaxe, «supprimer [] 2darray». Cette suppression doit avoir lieu dans sa portée pour libérer la mémoire et éviter les fuites de mémoire. Le programme suivant illustre cela, avec une portée imbriquée:

#inclure
Utilisation de Namespace Std;
int main()

if (1 == 1)
String (* ptr2d) [5] = new String [5] [5] "aa", "ab", "ac", "ad", "ae",
"Ba", "bb", "bc", "bd", "be",
"CA", "CB", "CC", "CD", "CE",
"Da", "db", "dc", "dd", "de",
"Ea", "eb", "ec", "ed", "ee";
couter<< ptr2D[0][0] <supprimer [] ptr2d;
couter<< ptr2D[0][0] <
retour 0;

La sortie est, aa, de Ptr2d [0] [0]. Après la suppression, Ptr2d [0] [0] ne renvoie rien. Bien que les autres éléments tels que PTR2D [1] [1] renvoient toujours une valeur, le tableau est considéré comme supprimé.

Tableau de magasin GRATUIT 2D en tant que pointeur à pointeur

Un tableau 2D peut être créé en tant que pointeur à pointeur. Dans ce cas, toutes les lignes devront être supprimées avant le fait que le tableau unidimensionnel reste est supprimé. Le programme suivant l'illustre dans la fonction principale C ++:

#inclure
Utilisation de Namespace Std;
int main()

String ** ptr2d = new String * [3]; // non de lignes
ptr2d [0] = nouvelle chaîne [5];
ptr2d [0] [0] = "aa"; ptr2d [0] [1] = "ab"; ptr2d [0] [2] = "ac"; ptr2d [0] [3] = "ad";
ptr2d [1] = nouvelle chaîne [5];
ptr2d [1] [0] = "ba"; ptr2d [1] [1] = "bb"; ptr2d [1] [2] = "BC"; ptr2d [1] [3] = "bd";
ptr2d [2] = nouvelle chaîne [5];
ptr2d [2] [0] = "CA"; ptr2d [2] [1] = "CB"; ptr2d [2] [2] = "cc"; ptr2d [2] [3] = "CD";
couter<< ptr2D[1][1] <// gratuit chaque sous-tableau (ligne)
pour (int i = 0; i< 3; ++i)
supprimer [] ptr2d [i];

supprimer [] ptr2d; // Libre le tableau de pointeurs
couter<< ptr2D[1][1] <retour 0;

La sortie est BB avant de supprimer. Après la suppression, la valeur de retour de PTR2D [1] [1] n'est rien.

Maintenant, ce tableau 2D pointeur en magasin gratuit est un tableau unidimensionnel de pointeur, de tableaux de pointeur. Ainsi, afin de supprimer le tableau 2D dans le magasin gratuit, toutes les lignes doivent être supprimées en premier avec la suppression [] avant que le tableau de pointeur unidimensionnel principal ne soit supprimé. Ceci utilise le schéma de suppression de l'opérateur pour un tableau 2D dans le magasin gratuit.

Inclusion de la bibliothèque

Le nouvel opérateur de suppression est en fait défini dans la bibliothèque. Cependant, y compris cette bibliothèque est facultative.

Conclusion

Pour supprimer un tableau ordinaire 2D, laissez-le sortir de la portée. Si le tableau 2D est en magasin gratuit, il doit être supprimé avec l'opérateur de suppression de la mémoire libre dans la portée dans laquelle il est déclaré. Si le tableau 2D en magasin gratuit était créé avec une syntaxe conventionnelle, alors une simple «supprimer [] 2darrayname» ferait pour la suppression. S'il a été créé en tant que pointeur à pointeur, alors les lignes devront être supprimées d'abord avec «Supprimer [] 2DArrayName [i]», puis le tableau 1D restant (sans éléments), être supprimé avec «Supprimer [] 2darrayname ».