Comment puis-je supprimer ce tableau 2D en c++
En simple 1D gamme:
node *nodes = new node[MAX_NODES];
La suppression par:
delete [] nodes;
Supprime tous les nœuds affectés dans le tableau.
Mais dans ce cas:
float (*buildingArray)[3] = new float[10][3];
Cette déclaration rendre buildingArray
d'un tableau unidimensionnel de 3 float pointeurs? Et c'est la libération de la ligne:
delete[] buildingArray;
Le au-dessus de la désallocation delete
le tableau, mais je remets en question si il va supprimer ses références?
- L'utilisation des vecteurs au lieu - cplusplus.com/reference/vector/vector - beaucoup plus simple.
- Parfois, un code existant de la base nous oblige à utiliser 2-dimensions des tableaux. Si je pouvais downvote commentaires....
Vous devez vous connecter pour publier un commentaire.
Oui, il le fait.
Il suffit de suivre la règle:
Vous devez appeler
delete
oudelete []
autant de fois que vous avez appelénew
ounew []
respectivement.Si vous aviez un tableau de pointeurs où chaque indice a été alloué de la mémoire dynamique, vous devez explicitement boucle à travers elle et de libérer chaque élément du tableau explicitement.
Sur une note de côté, vous êtes beaucoup mieux d'utiliser un
std::vector
oustd::array
plutôt que allouée dynamiquement tableau.float (*buildingArray)[3] = new float[10][3];
alloue suffisamment de dynamique de la mémoire pour stocker un tableau de 10 tableaux de 3 flotteurs. L'ensemble de stockage est sur le freestore(aka tas). Mais depuis qu'il a été allouée à l'aide d'un seul appel ànew []
un seul appel àdelete []
dellocates parfaitement.delete
. La règle que j'ai dit est vrai, rappelez-vous la règle et vous ne serez pas trébucher.Oui, il le fait. L'explication est parce qu'il n'y a pas de données dans la mémoire au sujet de combien les dimensions de votre tableau a.
Si vous avez un 3*4 éléments de tableau, c'est exactement le même comme un 12 éléments de tableau. C'est juste la façon de vous adresser les éléments spécifiques (qui sont stockées dans une ligne après la ligne de la mode) qui change.
Donc
delete[]
fonctionnera parfaitement.Mais en utilisant
new
etdelete
opérateurs n'est pas si fréquent de nos jours avec pointeurs intelligents, à moins de vraiment avoir une bonne raison pour le contrôle de l'allocation de vous-même.new float[10][3]
alloue un tableau de 10 tableaux de 3floats
et retourne un pointeur vers le premier élément (qui est un tableau de 3 flotteurs).Appel
delete[]
sur ce pointeur cause l'ensemble du réseau à être supprimé.La seule différence entre les deux cas est que dans le premier cas, le type des valeurs stockées dans le tableau alloué dynamiquement est
float
et dans le second cas, le type estfloat[3]
.