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.
Le problème de savoir si une variable est initialisée ou non est indécidable dans sa generalite. Le compilateur peut avertir sur des cas particuliers (ou accepter d'avertir de donner des faux positifs).Envoyé par Ulmo
> 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!
Salut,
Ce que jean marc voulait dire, c'est que si tu choisi les bonnes options de compilation (que tu le regle en mode "paranoïaque", par exemple), ton compilateur criera au scandale chaque fois que tu feras l'erreur...
S'il accepte de continuer la compilation, tu auras au moins un avertissement, dont il t'appartiendra de le prendre en compte.
A méditer: La solution la plus simple est toujours la moins compliquée
Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
Compiler Gcc sous windows avec MinGW
Coder efficacement en C++ : dans les bacs le 17 février 2014
mon tout nouveau blog
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
Je sais que par défaut, le mode Debug de VS le fait alors que le mode release ne le fait pas (d'où certain bug qui n'apparaissent qu'en release) (source). C'est lié au optimisations. Il reste que compter sur le compilateur n'est pas la bonne solution.Envoyé par hogan
Pour GCC je ne sais pas commen ça se passe. Donc pareil, il ne faut pas compter dessus.
Pour VS : Project/Properties/C++/General/Warning Level à mettre au niveau 4> Dis m'en plus stp.
Pour gcc : -Wall -W
Il me semble que le debugger de VS initialise au contraire les variables à une valeur forcément invalide (0xCCCCCCCC pour les variables sur la pile) histoire d'aider au débogage...
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.
Tu as raison, ma source parlait plutôt des variables entières.
> pas mal! Mais mieux vaut s'en passer si on veut pouvoir porter son code. Puis en initialisant les variables avec 1 valeur par défaut on gagne en lisibilité n'est ce pas!Envoyé par Médinoc
> effectivement on retrouve bien 0 comme valeur par défaut dans beaucoup de source du c++ mais le NULL y est tt aussi répendu. A mon sens c'est plus un pb de conformité par rapport à l'écriture adoptée...il vaut mieux utiliser 1 seul représentation pour rester cohérent. L'idéal serait peut être de faire un typedef de façon à pouvoir switcher facilement de l'un vers l'autre.Envoyé par Jean-Marc.Bourguet
De vieux restes de C surement> effectivement on retrouve bien 0 comme valeur par défaut dans beaucoup de source du c++ mais le NULL y est tt aussi répendu. A mon sens c'est plus un pb de conformité par rapport à l'écriture adoptée...il vaut mieux utiliser 1 seul représentation pour rester cohérent. L'idéal serait peut être de faire un typedef de façon à pouvoir switcher facilement de l'un vers l'autre.![]()
En vérité tu trouvera typiquement dans tes fichiers include un
pour les compilateurs C++, et un
Code : Sélectionner tout - Visualiser dans une fenêtre à part #define NULL 0
pour les compilateurs C.
Code : Sélectionner tout - Visualiser dans une fenêtre à part #define NULL ((void*)0)
Il y a donc stricte équivalence entre les 2 du point de vue technique. Pour ce qui est de la théorie, Jean-Marc.Bourguet a très bien résumé la situation ^^
Partager