Un objet peut-il détruire lui-même?
J'ai un objet qui a besoin de détruire lui-même.
-
Peut-il être fait?
-
Est l'exemple de mal?
void Pawn::specialMoves(Coordinate const& from, Coordinate const& to, int passant) { /*...*/ m_board->replace(to, new Queen(m_colour));//replace pawn by queen } void Board::replace(Coordinate const &to, Piece* newPiece) { delete tile[to.x()][to.y()]; tile[to.x()][to.y()] = newPiece; }
Quel objet est en train de se détruire? FTR, détruisant lui-même serait soit
Je ne vois rien de s'auto-détruire dans votre exemple.
Pion supprime lui-même. J'imagine une fois
La question a été mal formulé. Le pion appelle une méthode qui, à son tour supprime le pion. Donc, en effet, le pion supprime lui-même.
C'est un très modèle commun dans le code qui implémente la gestion de la mémoire avec le comptage de référence. Count == 0 est harakiri.
delete this;
ou this->~T();
(avec T
soit son type). Les deux sont valables, mais nécessitent beaucoup de soins pour être utilisé correctement.Je ne vois rien de s'auto-détruire dans votre exemple.
Pion supprime lui-même. J'imagine une fois
m_board->replace(to, new Queen(m_colour));
a été appelé la fonction void Pion::specialMoves (...) "ne peut pas terminer"La question a été mal formulé. Le pion appelle une méthode qui, à son tour supprime le pion. Donc, en effet, le pion supprime lui-même.
C'est un très modèle commun dans le code qui implémente la gestion de la mémoire avec le comptage de référence. Count == 0 est harakiri.
OriginalL'auteur danjjl | 2012-03-25
Vous devez vous connecter pour publier un commentaire.
Oui, c'est légal de faire appel
delete this
de l'intérieur d'une fonction membre. Mais il y a très rarement une bonne raison de le faire (surtout si vous êtes en train de rédiger idiomatiques C++, où la plupart de la mémoire-tâches de gestion, il convient de déléguer à des conteneurs, des pointeurs intelligents, etc.).Et vous devez être très attention:
new
(pasnew[]
).new[]
.Un peu tard ici, mais à s'assurer qu'un objet n'a pas été alloué par
new[]
, serait-il suffisant pour écrireoperator new[]() = delete
?Je suis en supposant que l'appel
std
conteneurs de retrait de méthodes est tout aussi fine, amirite?OriginalL'auteur Oliver Charlesworth
Voici un bon test de cohérence pour la réalisation de
supprimer
.OriginalL'auteur John Calsbeek
Oui, cela devrait fonctionner. Même
delete this;
est autorisé.Mais le code appelant
specialMoves()
pourrait être une mauvaise surprise.OriginalL'auteur Henk Holterman
A: bien Sûr. "supprimer ce" est un idiome populaire COM/ActiveX
Aussi loin que votre algorithme, je vous suggère de:
un "conseil" objet a "tuiles". Peut-être juste un simple tableau 2d.
Vous commencez avec n "morceaux"
Certains contrôleur (peut-être un "jeu" de l'objet), se déplace d'une "pièce" à l'égard d'une "tuile".
Chaque "tuile" est une référence à 0 ou 1 "morceaux"
Je ne suis pas sûr que je vois aucune raison de créer ou de supprimer quoi que ce soit sur un par-déplacer.
À mon humble avis...
OriginalL'auteur paulsm4
Aussi longtemps que vous n'avez pas accès à des variables de membre ou de l'
this
pointeur après l'appel à la destruction de l'objet, vous devriez être bien. Puisqu'il n'apparaît pas que vous êtes en train de faire une de ces choses, l'exemple devrait fonctionner.OriginalL'auteur tmpearce