2010-10-06 7 views
4

En C++, si vous passez un pointeur vers un pointeur dans une méthode, supprimez-vous le pointeur référencé en premier? Avez-vous à nettoyer dans la méthode? Je vérifie la mémoire dans le gestionnaire de tâches et il fuit!Comment supprimer un pointeur sur un pointeur?

Merci!

+4

Un exemple concret serait utile. –

Répondre

7

Vous supprimez un pointeur vers un pointeur comme ceci:

int** p = 0; 
p = new int*; // create first pointee 
*p = new int; // create 2nd pointee 
**p = 0;  // assign 2nd pointee 
// free everything 
delete *p;  
delete p; 

Il me semble rare de supprimer un pointeur qui a été passé dans une méthode. Mais de toute façon:

void freeme(int **p) { 
    delete *p; 
    *p = 0; 
} 

int main() { 
    int *a = new int; 
    *a = 3; 
    freeme(&a); 
    // a == 0 now 
} 
+0

Merci! J'avais besoin de supprimer le pointeur référencé à l'intérieur de la méthode car il n'était plus nécessaire en dehors de la méthode. – Moderator71

+2

En utilisant C++ beaucoup, il semble étrange de passer des pointeurs RAW jamais. –

0

Vous devriez commencer par le bas et remonter. Sinon, vous perdrez votre référence à la référence des données dans la chaîne de références!

1. Supprimez les données que vous obtenez par déréférencement deux fois, à savoir *myPtrToPtr

2. Supprimez les données que vous obtenez (le pointeur) par déréférencement une fois, à savoir myPtrToPtr

Mais bien sûr, ne le faites que si le pointeur et la chose pointée ont été alloués dynamiquement. Je suis d'accord avec le commentateur ... être plus précis serait utile pour nous donner un peu de contexte.

0

En cas de fuite, vous devez d'abord supprimer le pointeur référencé, puis supprimer le pointeur de référencement. Une fois que vous avez supprimé le pointeur de référencement, l'accès au stockage du pointeur référencé serait un comportement indéfini car vous venez de détruire l'objet.

0

Vous devez d'abord définir qui est le propriétaire de chaque pointeur avant de penser à le détruire.

Et si vous devez détruire un pointeur qui pointe vers un pointeur que vous possédez, vous devez d'abord détruire le pointeur référencé ou enregistrer sa valeur temporairement avant de détruire l'autre pointeur. Mais vous devriez envisager d'utiliser un outil de vérification de la mémoire comme valgrind/purify ou équivalent et penser à qui possède quoi (c'est-à-dire qui devrait détruire qui) avant de faire une conjecture.

3

"Un pointeur vers un pointeur"?

Si vous avez pour exemple:

MyClass * obj_ptr = new Myclass(); 
MyClass ** obj_ptr_ptr = &obj_ptr; 

//then if you want to clean do : 

delete (*obj_ptr_ptr);//to clean the class instance. 

Pourquoi auriez-vous besoin de nettoyer le pointeur ... si vous avez utilisé malloc ... ou tout autre dynamique (tas) allocation uniquement. Mais c'est probablement sur la pile que vous avez alloué le pointeur, donc vous n'avez pas besoin de le nettoyer. À la fin de sa portée, la mémoire de la pile utilisée dans la portée est nettoyée.

Questions connexes