Vérifier pointeur definedness en C++
Comment puis-je vérifier si une variable, plus précisément un pointeur est défini en C++? Supposons que j'ai une classe:
class MyClass {
public:
MyClass();
~MyClass() {
delete pointer; //if defined!
}
initializePointer() {
pointer = new OtherClass();
}
private:
OtherClass* pointer;
};
Pouvez-vous s'il vous plaît modifier le titre? il semble que vous voulez vérifier si une variable est définie (littéralement). Mais il semble que vous voulez vérifier si une variable contient une valeur définie.
OriginalL'auteur tunnuz | 2008-12-19
Vous devez vous connecter pour publier un commentaire.
Pourquoi s'inquiéter sur la vérification de la valeur des pointeurs? Juste l'initialiser à une valeur de pointeur null et puis il suffit d'appeler le supprimer. delete sur un pointeur null ne fait rien (le standard des garanties).
Et à chaque fois que vous appelez le supprimer, vous devez définir le pointeur null, la valeur du pointeur. Alors vous êtes tous très bien.
Comment le compilateur de savoir qu'un pointeur à zéro au moment de l'exécution?
Tommaso, qui sonne coquine. je voudrais aussi savoir comment le compilateur ne peut pas savoir au moment de la compilation de ce que le pointeur contient au moment de l'exécution.
pourquoi s'embêter à le définir à 0 après l'avoir supprimé. Après un objets destructeur est appelé, il n'existe pas plus. Par conséquent, vous n'avez pas à vous soucier de rien d'autre référence.
Rogers: alors qu'il n'a pas d'aide ici, il ne fait pas de mal non plus. Dans d'autres situations, où, au lieu de le destructeur de la supprimer a lieu dans une autre partie du code, le paramètre le pointeur à 0 permettra d'éviter un double supprimer par le biais de cette variable (et non pas par d'autres pointeurs).
OriginalL'auteur Johannes Schaub - litb
J'ai tendance à initialiser mes valeurs de pointeur NULL sur la construction de l'objet. Cela permet de contre-vérifier la valeur NULL pour voir si le pointeur de la variable est définie.
Ou, dans C++0x, vous devez utiliser nullptr.
Je suis d'accord, même si j'ai tendance à" ressemble ", il est conseillé de respirer de temps en temps".
OriginalL'auteur Gabriel Isenberg
En plus de vérifier la
0
(NULL
), une solution serait de restructurer le code de sorte que vous force le pointeur d'être toujours valide. Ce n'est pas toujours possible, mais dans la plupart des cas, c'est la meilleure solution.Dans votre cas (comme dans la plupart des autres cas), cela signifie que l'initialisation du pointeur dans le constructeur (c'est à dire dès que sa durée de vie commence) et de le détruire à la fin de sa durée de vie. Faire de la variable
private
et ne permettent pas directement l'accès en écriture pour s'assurer qu'elle restera toujours valide.C'est souvent utilisée motif en C++ et efficacement les limites de la durée de vie des objets de la pointee à la durée de vie de votre classe. Parfois, il pourrait également être une solution viable pour assurer une sorte de
reset
qui supprime le pointeur et immédiatement ré-initialise. Si c'est écrit dans une exception, en toute sécurité, vous avez également veillé à ce que le pointeur de la souris ne sera jamais nulle.Ne pas créer un
bool
ean drapeau de garder une trace de votre pointeur de validité. Cette solution n'a aucun avantage, et de nombreux inconvénients, pour paramètre le pointeur de0
.OriginalL'auteur Konrad Rudolph
Le point de l'ensemble du constructeur n'est qu'après qu'il a rempli toutes les variables membres sont correctement définis. Dans ce cas, la valeur NULL est une valeur de la valeur initiale.
L'appel de supprimer sur la valeur NULL est bien définie.
Plus normalement, si vous vous attendez à ce que le constructeur de définir la valeur du pointeur BRUT. Aussi parce que votre objet contient un pointeur BRUT et, évidemment, elle appartient (c'est de le supprimer, cela implique la propriété), vous DEVEZ assurez-vous de remplacer le compilateur a généré versions de Constructeur de Copie et l'Opérateur d'Affectation.
Alternativement, vous pouvez utiliser l'une des pointeurs intelligents. Probablement std::auto_ptr<> sauf si vous voulez vraiment faire l'objet copiable.
OriginalL'auteur Martin York
Vous devriez toujours initialiser les pointeurs à NULL dans votre constructeur; de cette façon, vous pouvez vérifier dans le destructeur, si elle a été initialisé. Aussi, il est plus efficace de le faire dans le constructeur de la liste des arguments comme:
De même, vous devez également définir la valeur NULL lorsque vous la supprimer et d'en vérifier la valeur par rapport à null lors de l'attribution, si l'objet va être ré-initialisé à de nombreuses reprises au cours de la durée de vie de votre programme. Cependant, la définition de la valeur NULL dans le destructeur ne fera aucune différence, puisque l'objet est de toute évidence va être détruit de toute façon.
L'avantage de cette façon de faire (au lieu de dire "pointeur = NULL;" explicitement dans le constructeur), c'est que le compilateur est déjà implicitement faire une mission de ce genre pour vous. Faire une attribution manuelle fait arriver deux fois, ce qui normalement n'est pas une grosse affaire, sauf si vous effectuez un grand nombre d'instances de ta classe dans une grande boucle ou de quelque chose.
delete
comprend déjà unNULL
vérifier. Ne pas vérifier la valeur null manuellement avant de le supprimer!Je n'appellerais pas ça "vide de sens", mais certainement "redondants" et "inutile"
OriginalL'auteur Nik Reiman
Vous ne pouvez pas, autant que je sache, je sais. Une méthode standard est à mettre à NULL quand il ne contient pas une valeur valide. Laissant les pointeurs autour de ce point de mémoire non valide est une mauvaise pratique en toutes circonstances. Si vous vous en tenez à cela, vous pouvez toujours vérifier la valeur NULL pour voir si elle est "défini" ou pas.
OriginalL'auteur Vilx-
Une réponse supplémentaire que personne d'autre n'a encore mentionné est d'utiliser un pointeur intelligent objet au lieu d'un pointeur brut. Selon la façon dont le pointeur est utilisé par la suite,
std::auto_ptr
,boost::shared_ptr
, ou un certain nombre d'autres pointeur intelligent classes pourrait être approprié ici.boost::scoped_ptr
peut également fonctionner si vous modifiez la façon dontinitializePointer()
travaille un peu.De cette façon, le smart pointeur prend soin de se souvenir si elle est valide ou pas et supprimer lui-même lorsque l'objet est détruit:
OriginalL'auteur Michael Burr
Le réel réponse est que de litb, mais je voulais juste faire un commentaire. À l'aide de pointeurs intelligents (dans ce cas, std::auto_ptr suffit) prend en charge le problème et a l'avantage que vous n'aurez pas besoin de penser à supprimer le pointeur dans le destructeur. En effet destructeur par défaut (généré par le compilateur) prendra en charge les ressources de la mémoire.
Faire le commentaire plus général encore, vous avez de la classe, de déclarer la cession de l'opérateur et le constructeur de copie marqués comme privés (et non définis) ou défini manuellement pour éviter la double supprime du pointeur. Compilateur fourni de l'opérateur== et le constructeur de copie seront il suffit de copier le pointeur et finalement, vous obtiendrez en un double supprimer. J'écris ici car c'est aussi quelque chose à prendre en compte si vous utilisez std::auto_ptr avec l'ajout de l'étrangeté de la copie de la sémantique dans le auto_ptr.
OriginalL'auteur David Rodríguez - dribeas