J'aimerais savoir comment tester si un pointeur sur un objet a bien été initialisé ?
MaClasse *obj;
if(obj != NULL) // c'est toujours vrai apparement
J'aimerais savoir comment tester si un pointeur sur un objet a bien été initialisé ?
MaClasse *obj;
if(obj != NULL) // c'est toujours vrai apparement
Dans le doute, pars du posulat que tu ne peux pas prévoir ce qui se trouve dans la zone mémoire que tu viens d'allouer. Il est donc vivement conseillé d'assigner la valeur 0 à ton pointeur lors de sa déclaration, et juste après sa desallocation.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Object* obj = 0; obj = truc; delete obj; obj = 0;
Ton 'if' est toujours vrai car lorsque tu fais seulement:
Tu n'as pas allouer de mémoire pour ton pointeur (donc il ne pointe nul part). Il est donc égal à NULL.
Code : Sélectionner tout - Visualiser dans une fenêtre à part Object *obj;
Si tu fais:
Tu alloues dynamiquement de la mémoire pour ton pointeur et donc s'il n'y a pas eu un manque de mémoire (ou autre problème d'allocation de mémoire), ton pointeur ne sera plus égal à NULL.Object *obj = new Object;
Bonne continuation.
Une variable d'un type primitif non initialisée reste non initialisée, sauf options du compilo paticulières ; elle contient donc n'importe quoi.Envoyé par vdumont
Donc dire qu'ici le pointeur est égal à NULL est une grosse erreur, qui se payera au mieux immédiatement, au pire lorsque tu livreras ton appli au client![]()
Mieux que SDL : découvrez SFML
Mes tutoriels 2D/3D/Jeux/C++, Cours et tutoriels C++, FAQ C++, Forum C++.
C'est le genre de trucs que tu t'en rends jamais compte avant d'avoir livré, parce qu'en debug ca passe alors qu'en release ca exploseEnvoyé par Laurent Gomila
Donc le mieux c'est toujours intialiser les variables, en l'occurence faire MaClasse *obj = NULL;
Et avec un bon réglage du compilateur, ce genre d'erreur ne sera pas permise.
> thx, je vais compléter mes constructeurs.Envoyé par Neo41
> J'achete!Envoyé par NewbiZ
vdumont, si mon test est vrai c bien que le pointeur n'est pas NULL!
> Option du compilo! Hey ça m'interesse. Est ce qu'on peut forcer le compilo à donner la valeur NULL a 1 objet non initialisé ?Envoyé par Laurent Gomila
> Dis m'en plus stp.Envoyé par Ulmo
Jean-Marc.Bourguet tu peux reformuler stp, jai pas bien saisi!
Tu connais la différence entre NULL et 0 ?Envoyé par NewbiZ
L'un a une valeur documentaire qui dit "en théorie, on m'emploie sur des pointeurs, et m'affecter à un entier relève de la volonté de nuire". Généralement, sur les pointeurs, c'est celui-là qu'on emploie...
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Personnellement, ça ne me choque pas de voir un 0 au lieu d'un NULL (je fais pareil). Juste un petit quote à ce sujet :Tu connais la différence entre NULL et 0 ?
L'un a une valeur documentaire qui dit "en théorie, on m'emploie sur des pointeurs, et m'affecter à un entier relève de la volonté de nuire". Généralement, sur les pointeurs, c'est celui-là qu'on emploie...
If you have to name the null pointer, call it nullptr; that's what it's going to be called in C++0x. Then, "nullptr" will be a keyword.
Les opinions sont assez divergentes sur le sujet. De bons auteurs (Stroustrup en tete si j'ai bonne memoire) preconisent l'utilisation de 0.Envoyé par Médinoc
Personnellement, j'utilise NULL.
Là, je suis sur le cul.Envoyé par Jean-Marc.Bourguet
Pour moi, c'est mélanger les torchons et les serviettes, ce qu'un langage fortement typé est justement censé aider à éviter...![]()
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Le probleme c'est que NULL n'est en rien different de 0 (en C++, en C c'est pire, ce peut etre mais pas obligatoirement (void*)0). Donc l'utilisation de NULL n'a qu'une valeur de commentaire et a un comportement bizarre en cas de surcharge et de resolution de template si on pense a lui comme un pointeur. Ils le trouvent donc dangereux. (Et certains ont ete brules dans le passe avec le partage d'entete avec C faisant que NULL etait defini comme (void*)0, ce qui ne doit plus arriver depuis un quinzaine d'annees).Envoyé par Médinoc
Partager