Destructeur C++: type '***' argument donné à "supprimer", prévu pointeur
J'ai déclaré une variable privée
vector<SomeClass> theVector;
quelque part à l'intérieur de mon SomeClass classe.
Pourquoi ne puis-je pas dire: delete theVector
à l'intérieur de mon SomeClass destructeur?
L'erreur du compilateur dit:
type `class Vector<SomeClass>' argument given to `delete', expected pointer
Ce qu'attend pointeur?
"attendu pointeur" signifie que le compilateur attend un pointeur à l'endroit où quelque chose d'autre a été donné. Il ne dit pas: "attendu" pointeur a été donné à supprimer.
Je vous recommande vivement de lire gnomesane.net/code/doc/ptrarray, il va vous expliquer comment pointeurs et références de travail.
Je vous recommande vivement de lire gnomesane.net/code/doc/ptrarray, il va vous expliquer comment pointeurs et références de travail.
OriginalL'auteur andandandand | 2008-12-20
Vous devez vous connecter pour publier un commentaire.
Si new et delete aller main dans la main.
De supprimer quelque chose, vous devez créer par les nouveaux (qui vous donne un pointeur). Vous pouvez ensuite supprimer le pointeur. La façon de déclarer le vecteur est créé sur la pile (pas le tas) et sera libéré quand elle est hors de portée.
*Supposons que la nouvelle est faite sur la SomeClass constructeur et le supprimer prtVector est faite sur la SomeClass destructeur.
Les deux exemples ci-dessus de-allouer toute la mémoire.
Nouveau alloue de la mémoire, puis appelle automatiquement le constructeur. Supprimer appelle le destructeur puis libère la mémoire utilisée dans le système. Remarque les conteneurs STL propre tous les objets placés en eux. Ainsi, lorsque le destructeur est appelé également détruit tous les objets.
Oui, les variables locales non attribué "nouveau" va être libéré automatiquement quand ils passent hors de portée. Donc, ne jamais utiliser de supprimer avec quelque chose que vous nouvelle ed.
OriginalL'auteur Martin York
En C++ (contrairement à Java), vous pouvez créer des objets sur la pile ou le tas. Un exemple de création d'il sur la pile est, comme vous l'avez fait:
Cet objet est hors de portée quand le frame de pile disparaît (normalement, lorsque vous êtes de retour de la fonction qui a créé l'objet.
Création d'objets sur le tas qui leur permet de survivre à la fonction qui les a créés et vous le faire en effectuant:
Vous pouvez ensuite passer le
theVectorPtr
pointeur de retour à l'appelant de la fonction (ou d'un magasin à l'échelle mondiale, ce que vous voulez).Afin de se débarrasser de l'objet sur le tas, vous supprimez de façon explicite:
quelque part dans votre code.
La suppression d'un objet sur le tas se termine le champ d'application de cet objet, de la même façon retour d'une fonction se termine la portée des variables créé sur la pile.
vector<SomeClass*> theVectorPtr = new vector<SomeClass>();
Seradelete theVectorPtr
travail ici aussi?ont travaillé mais on ne sait jamais 🙂
new
vous donne un pointeur et que vous essayez d'attribuer à un vecteur plutôt qu'un vecteur de pointeur. Qui ne fera même pas compiler. Si vous retournez en arrière dans un pointeur, il permettra de résoudre ça, mais alors le type dans le vecteur ne correspondent pas. Essayezstd::vector<SomeClass*> *v = new std::vector<SomeClass*>();
- et vous aurez également être en mesure de le supprimer, mais vous pourriez vouloir vous assurer que vous supprimer les pointeurs dans le vecteur premier.OriginalL'auteur paxdiablo
Si un objet (plutôt qu'une valeur est définie comme étant une variable de membre de classe, puis son stockage est toujours liée à l'objet de l'instance de cette classe.
Par conséquent, si l'objet est alloué sur la pile, alors que l'objet et le champ de mourir lorsque la pile se déroule.
Si l'objet est alloué sur le tas, alors le champ objet de mourir lorsque la totalité de l'objet contenant meurt avec supprimer.
Vous ne serez en application de supprimer un champ, si c'est un pointeur, puisque tout ce qui est stocké dans l'objet contenant l'adresse d'une autre zone de mémoire, et vous supprimez les matériaux dans ce domaine.
OriginalL'auteur Uri
La mémoire pour theVector est une partie de la mémoire allouée pour le SomeClass objet, de sorte que vous ne pouvez pas le supprimer sans supprimer l'ensemble de la SomeClass objet. La mémoire pour theVector sera automatiquement libéré lorsque la SomeClass objet est détruit.
OriginalL'auteur David Norman
Pour détruire tous les objets détenus dans le vecteur, vous devez effectuer les opérations suivantes:
Cela se fera automatiquement si le vecteur est hors de portée.
OriginalL'auteur
C'est parce que theVector n'est pas un pointeur, ce qui est le
delete' expects. "Expected pointer" means the operand of
supprimer " doit être un pointeur.Comparer cela à
Il va sûrement générer un message d'erreur similaire à ce que vous avez.
OriginalL'auteur PolyThinker
c++ vous permet de créer l'objet dans la pile et le tas.
Lorsque l'objet est créé dans le tas grâce à l'opérateur new, comme indiqué ci-dessous, il retourne le pointeur vers l'objet dans le tas.
Pour objet créé dans la pile le constructeur renvoie l'objet plutôt que de pointeur comme indiqué ci-dessous.
et de la pile de l'objet détruit automatiquement lorsque la variable(obj_class) est hors de portée,mais de l'objet créé sur le tas de vies pour toujours.Donc, pour détruire des tas d'objets c++ vous donne opérateur d'effacement qui prend un pointeur en argument et détruit l'objet le pointeur pointe.
OriginalL'auteur yesraaj