Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
4156 connectés 

 


Dernière réponse
Sujet : 0xcdcdcdcd
youdontcare

legreg a écrit a écrit :

ben j'essayais d'apprendre des choses a godbout
mais la pedagogie ca n'a pas la cote par ici apparemment :(
 
LEGREG


mais si ... c'est juste que le sujet mérite un topic à lui tout seul et ne devrait pas être mélangé avec un NULLage de pointeurs.


Votre réponse
Nom d'utilisateur    Pour poster, vous devez être inscrit sur ce forum .... si ce n'est pas le cas, cliquez ici !
Le ton de votre message                        
                       
Votre réponse


[b][i][u][strike][spoiler][fixed][cpp][url][email][img][*]   
 
   [quote]
 

Options

 
Vous avez perdu votre mot de passe ?


Vue Rapide de la discussion
youdontcare

legreg a écrit a écrit :

ben j'essayais d'apprendre des choses a godbout
mais la pedagogie ca n'a pas la cote par ici apparemment :(
 
LEGREG


mais si ... c'est juste que le sujet mérite un topic à lui tout seul et ne devrait pas être mélangé avec un NULLage de pointeurs.

LeGreg ben j'essayais d'apprendre des choses a godbout
mais la pedagogie ca n'a pas la cote par ici apparemment :(
 
LEGREG
youdontcare n0mad >> je pense qu'il parlait du cas ou tu as deux objets A et B qui ont un pointeur vers C. si A libère C, le pointeur vers C de B est invalide, car non mis à NULL.

 

[edtdd]--Message édité par youdontcare--[/edtdd]

LeGreg

n0mad a écrit a écrit :

 
Ben si. Toute variable doit être initialisée sinon c'est de la programmation à l'arrache. Pour les pointeurs, il faut les initialiser à NULL.  




 
relis le thread..
 
LEGREG

n0mad

legreg a écrit a écrit :

je ne sais pas lequel tu appelles pC
 
je suppose que c'est pCa,
mais pCa n'est pas null puisque
personne ne lui a donne la valeur null.
 
Le fait de faire free() sur un pointeur
et de donner la valeur NULL a ce pointeur
ne veut pas dire que tous les pointeurs
qui pointent vers cette espace memoire vont devenir
NULL de facon magique. Et donc ton test est invalide.
 
LEGREG  




 
Ben si. Toute variable doit être initialisée sinon c'est de la programmation à l'arrache. Pour les pointeurs, il faut les initialiser à NULL.

LeGreg je ne sais pas lequel tu appelles pC
 
je suppose que c'est pCa,
mais pCa n'est pas null puisque
personne ne lui a donne la valeur null.
 
Le fait de faire free() sur un pointeur
et de donner la valeur NULL a ce pointeur
ne veut pas dire que tous les pointeurs
qui pointent vers cette espace memoire vont devenir
NULL de facon magique. Et donc ton test est invalide.
 
LEGREG
godbout ben  
if (pC == NULL)
{
 return false;
}
else
{
...
}
 
nan ??
LeGreg

Godbout a écrit a écrit :

Ben je vois pas trop ou est le pb.
Avant de faire l'appel a C tu le testes nan ?  




 
explicite :
tu fais le test comment?
 
LEGREG

LeGreg

youdontcare a écrit a écrit :

moi non plus je ne vois pas le problème. c'est résolu depuis belle lurette avec COM (comptage de références), MAX (tableau de références), etc. au final ça se ramène toujours à 'tester si le machin est nul avant de le toucher', ce qui est le problème du topic.  




 
chut ;) !
 
COM c'est une solution par exemple
j'essaie juste de leur faire comprendre que
parfois la vie n'est pas aussi simple.
car meme si tu peux utiliser des objets COM
il y a des projets
ou tu te mets en tete de gerer la duree
de vie de tes objets toi meme
et si tu ne vois pas ou est le probleme
c'est la qu'il y a un probleme.
 
A+
LEGREG

youdontcare moi non plus je ne vois pas le problème. c'est résolu depuis belle lurette avec COM (comptage de références), MAX (tableau de références), etc. au final ça se ramène toujours à 'tester si le machin est nul avant de le toucher', ce qui est le problème du topic.
godbout Ben je vois pas trop ou est le pb.
Avant de faire l'appel a C tu le testes nan ?
LeGreg

Godbout a écrit a écrit :

Ben personnellement j'initialise chacun de mes pointeurs a NULL, et lorsque je les libere avec un free je les remet a NULL aussi  




 
eheh si tu veux voila de quoi te donner mal au crane :
tu as deux objets A et B, chacun possede un pointeur vers un autre objet C (appelons les pCa et pCb).
Supposons qu'il faille liberer l'objet C. qui le libere A ou B?
peu importe supposons pour l'exemple qu'il s'agisse de B.
donc B fait ce que tu dis, il libere C et met pCb a nul.
Or A qui ignore tout de B (et inversement)
continue a croire que C est alloue. => au prochain appel
de C, plantage (ou pire, pas plantage).
 
Tout ca pour dire que les histoires de pointeur
c'est un peu plus complique que "est-il a NULL ou pas".
(et c'est encore pire quand A et B sont dans deux process differents). I
Il faut prevoir le mecanisme a l'avance
et faire en sorte qu'il soit infaillible sinon
=> plantage.
 
A+
LEGREG

deathsharp c vrai :jap:
antp

deathsharp a écrit a écrit :

pour le NULL jsuis pas sur qu'il faille init a NULL avant l'allocation.
si elle echoue, le pointeur sera NULL. (a verifier)




 
NULL c'est pour savoir si c'est déjà alloué... Si on n'initialise pas, on ne peut pas savoir à tout moment si une case représente un pointeur réel ou juste une crasse en mémoire. Si on initialise à null, un if(machin<>NULL) suffit.

youdontcare oui, franchement une boucle c'est pas la mort ... sinon un memset() peut faire l'affaire.
antp

dindonpoilu a écrit a écrit :

et y'a pas un truc simple pour initialiser toutes les cases d'un tableau avec une valeur précise ?



 
bhen tu fais un truc genre memset pour mettre tout le tableau à 0, ça devrait passer...

 

[edtdd]--Message édité par antp--[/edtdd]

deathsharp pour le NULL jsuis pas sur qu'il faille init a NULL avant l'allocation.
si elle echoue, le pointeur sera NULL. (a verifier)
 
sinon en C++ yaurai bien une methode avec new, try et bad_alloc
godbout Ben une boucle c'est pas la mort :??:
dindonpoilu et y'a pas un truc simple pour initialiser toutes les cases d'un tableau avec une valeur précise ? au lieu de faire une boucle à la con et de le faire soi même ?
antp en Delphi c'est encore plus vicieux:
tu as la méthode Destroy qui libère la mémoire, et la méthode Free qui libère la mémoire si elle est = à nil (null quoi).
ça laisse penser que si elle est assez intelligente que pour faire le test avant de libérer, elle met à nil après, bhen non :sweat:
godbout c'est bien pour ca que je le fais ;)
antp c'est plus sûr, vu que le free ne met pas à null, y a un risque de faire plusieurs free si tu fais un truc genre if(machin<>NULL) free;
godbout Ben personnellement j'initialise chacun de mes pointeurs a NULL, et lorsque je les libere avec un free je les remet a NULL aussi
antp bhen faudrait au moins initialiser ton tableau avec des NULL comme ça t'es sûr qu'y a NULL Si un pointeur est pas alloué, et au moins tu testes avec une valeur fiable (que tu as mises au démarrage du prog)
tu prends une fonction dont je ne me souviens pas du nom qui fout des 0 sur toute la zone mémoire de ton tableau, avant la première allocation bien sûr.
dindonpoilu

Godbout a écrit a écrit :

au pire tu testes si c'est egal a NULL nan ??  




 
moi je veux bien mais faudrait que tous les pointeurs dans mon tableaux soient initialisés à NULL au départ.
Mais en fait j'ai plein de tableaux, avec plein de cases. Et je veux réduire la complexité de mon algo.

dindonpoilu j'ai un tableau avec plein de cases, un pointeur dans chaque case. Je ne veux pas allouer tous les pointeurs donc je le fais au fur et à mesure (si j'en ai besoin)
Donc pour un indice donné je regarde si le pointeur est une adresse valide, et si c'est pas le cas je l'alloue.
godbout au pire tu testes si c'est egal a NULL nan ??
youdontcare tu t'en sers pour quoi exactement ? j'ai beau chercher, je ne vois pas de cas où tu pourrais en avoir besoin ...
dindonpoilu ok donc en release je peux pas savoir si l'adresse est allouée ou pas ?
 
pas grave, au pire je fais nimpe :)
youdontcare tu as (au moins) deux modes de compilation.
 
debug = pour ... le debug, vc++ génère du code en plus comme l'initialisation de la variable allouée à 0xcdcdcdcd & co. le code généré n'est pas optimisé et donc plutôt lent.
 
release = code optimisé : plus petit, plus rapide, plus mieux. quand tu distribues (= quand tu releases) un programme, tu donnes cet éxécutable et non pas celui du dessus.
 
nimpe = n'importe quoi ...
dindonpoilu scuse moi j'suis pas une bête en programmation. Je pige pas tout ce que tu dis.
c quoi "en DEBUG" ?
"nimpe" ?
bon je vais me renseigner pour voir ce que c'est IsBadReadPtr()
youdontcare arrête ça tout de suite. la mémoire est initialisée à 0xcdcdcdcd en DEBUG. en release ça plantera.  
 
je vois vraiment pas pourquoi t'as besoin de ça d'ailleurs ... à part pour faire nimpe :D
 
sinon y'a IsBadReadPtr() & co pour tester la mem.
dindonpoilu Sous Visual C++, pour savoir si une adresse est allouée ou non je vérifie si elle est égale à 0xcdcdcdcd. Si c'est le cas elle n'est pas allouée.
 
Est-ce qu'il existe la même possibilité avec gcc sous Linux ?

Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)