Question

J'ai donc un pointeur vers un tableau de pointeurs.Si je le supprime comme ceci :

delete [] PointerToPointers;

Cela supprimera-t-il également tous les pointeurs pointés ?Sinon, dois-je parcourir tous les pointeurs et les supprimer également, ou existe-t-il un moyen plus simple de le faire ?Mon google-fu ne semble pas me donner de bonnes réponses à cette question.

(Et oui, je sais que je dois utiliser un vecteur.C'est l'un de ces devoirs de type "rattrapage du C++" à l'école.)

Était-ce utile?

La solution

Oui, vous devez parcourir les pointeurs et les supprimer individuellement.

Raison:Et si un autre code contenait des pointeurs vers les objets de votre tableau ?Le compilateur C++ ne sait pas si c'est vrai ou non, vous devez donc être explicite.

Pour une « manière plus simple », deux suggestions :(1) Créez un sous-programme à cet effet afin qu'au moins vous n'ayez pas à écrire le code plus d'une fois.(2) Utilisez le paradigme de conception du "pointeur intelligent" dans lequel vous conservez un tableau d'objets avec des compteurs de références, puis les objets sont supprimés lorsqu'ils ne sont plus référencés par aucun code.

Autres conseils

Je suis d'accord avec Jason Cohen, même si nous pouvons être un peu plus clairs sur la raison pour laquelle vous devez supprimer vos pointeurs avec la boucle.Pour chaque "nouvelle" ou allocation de mémoire dynamique, il doit y avoir une "suppression" d'une désallocation de mémoire.Parfois, la « suppression » peut être masquée, comme avec les pointeurs intelligents, mais elle est toujours là.

int main()
{
  int *pI = new int;
  int *pArr = new int[10];

jusqu'à présent, dans le code, nous avons alloué deux morceaux de mémoire dynamique.Le premier est juste un entier général, le second est un tableau d’entiers.

  delete pI;
  delete [] pArr;

ces instructions de suppression effacent la mémoire allouée par les "nouveaux"

  int ppArr = new int *[10];

  for( int indx = 0; indx < 10; ++indx )
  {
    ppArr[indx] = new int;
  }

Ce morceau de code effectue les deux allocations précédentes.Nous créons d’abord un espace pour notre int dans un tableau dynamique.Nous devons ensuite parcourir et allouer un int pour chaque emplacement du tableau.

  for( int indx = 0; indx < 10; ++indx )
  {
    delete ppArr[indx];
  }
  delete [] ppArr;

Notez l'ordre dans lequel j'ai alloué cette mémoire, puis que je l'ai désallouée dans l'ordre inverse.En effet, si nous devions faire delete [] ppArr;nous perdrions d’abord le tableau qui nous indique quels sont nos autres pointeurs.Ce morceau ou cette mémoire serait restitué au système et ne pourrait donc plus être lu de manière fiable.

  int a=0;
  int b=1;
  int c=2;

  ppArr = new int *[3];

  ppArr[0] = &a;
  ppArr[1] = &b;
  ppArr[2] = &c;

Je pense que cela devrait également être mentionné.Ce n’est pas parce que vous travaillez avec des pointeurs que la mémoire vers laquelle pointent ces pointeurs a été allouée dynamiquement.C’est-à-dire que ce n’est pas parce que vous avez un pointeur qu’il doit nécessairement être supprimé.Le tableau que j'ai créé ici est alloué dynamiquement mais les pointeurs pointent vers des instances locales de ints. Lorsque nous supprimons cela, il nous suffit de supprimer le tableau.

  delete [] ppArr;

  return 0;

}

En fin de compte, la mémoire allouée dynamiquement peut être délicate et de toute façon, vous pouvez l'envelopper en toute sécurité comme dans un pointeur intelligent ou en utilisant des conteneurs stl plutôt que les vôtres, ce qui peut rendre votre vie beaucoup plus agréable.

Voir conteneur de pointeur boost pour un conteneur qui effectue pour vous la suppression automatique des pointeurs contenus, tout en conservant une syntaxe très proche des conteneurs STL ordinaires.

Les pointeurs ne sont en réalité que des références de mémoire et non de petits objets .net autonettoyants.Créer des destructeurs appropriés pour chaque classe rendra la suppression un peu plus propre que des boucles massives dans le code.

Prenons un exemple réel (pseudocodé). Imaginez que vous ayez une classe comme celle-ci :

class Street
{
    public:
        Street();
        ~Street();
    private:
        int HouseNumbers_[];
}

typedef *Street StreetSign;

Si vous disposez d'un ensemble de panneaux de signalisation et que vous supprimez votre ensemble de panneaux de signalisation, cela ne signifie pas que vous supprimez automatiquement les rues.Ils sont toujours là, en brique et en mortier, mais ils n'ont plus ces panneaux qui les désignent.Tu t'es débarrassé ceux spécifiques exemples de pointeurs vers les rues.

Un tableau de pointeurs est (conceptuellement) un peu comme un tableau d'entiers, c'est un tableau de nombres représentant les emplacements mémoire de divers objets.Ce ne sont pas les objets eux-mêmes.

Si vous supprimez[] le tableau de pointeurs, tout ce que vous avez fait est de supprimer un tableau d'entiers.

Je pense que vous allez devoir faire une boucle, j'en ai peur.

Je ne sais pas pourquoi cette réponse a été si longue et confuse.

Si vous supprimez le tableau de pointeurs, vous libérerez la mémoire utilisée pour un tableau de généralement INTS.
un pointeur vers un objet est un entier contenant l'adresse.

Vous avez supprimé un tas d'adresses, mais aucun objet.

Delete ne se soucie pas du contenu d'un espace mémoire, il appelle un (s) destructeur (s) et marque le MEM comme gratuit.

Il ne se soucie pas qu'il ait simplement supprimé un tas d'adresses d'objets, il voit simplement des INT.

C'est pourquoi vous devez d'abord parcourir le tableau !Et appelez Supprimer sur chaque élément, puis vous pouvez supprimer le stockage du tableau lui-même.

Bien maintenant mon la réponse est devenue un peu longue.......étrange...;)

Modifier:La réponse de Jason n’est pas fausse, elle ne parvient tout simplement pas à atteindre le but.Ni le compilateur ni rien d'autre en C (++) ne se soucient de vous supprimer des trucs qui sont ailleurs pointés.Vous pouvez simplement le faire.D'autres pièces de programme essayant d'utiliser les objets supprimés se feront se faire.Mais personne ne vous gênera.Il ne sera pas non plus un problème de détruire un tableau de pointeurs vers des objets, lorsque les objets seront référencés ailleurs.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top