0xcdcdcdcd

0xcdcdcdcd - Programmation

Marsh Posté le 03-01-2002 à 14:47:05    

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 ?

Reply

Marsh Posté le 03-01-2002 à 14:47:05   

Reply

Marsh Posté le 03-01-2002 à 14:51:27    

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.

Reply

Marsh Posté le 03-01-2002 à 14:53:23    

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()

Reply

Marsh Posté le 03-01-2002 à 14:57:58    

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 ...

Reply

Marsh Posté le 03-01-2002 à 15:01:29    

ok donc en release je peux pas savoir si l'adresse est allouée ou pas ?
 
pas grave, au pire je fais nimpe :)

Reply

Marsh Posté le 03-01-2002 à 15:03:02    

tu t'en sers pour quoi exactement ? j'ai beau chercher, je ne vois pas de cas où tu pourrais en avoir besoin ...

Reply

Marsh Posté le 03-01-2002 à 15:07:20    

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


---------------
Super.
Reply

Marsh Posté le 03-01-2002 à 15:07:55    

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.

Reply

Marsh Posté le 03-01-2002 à 15:10:07    

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.

Reply

Marsh Posté le 03-01-2002 à 15:10:39    

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.


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 03-01-2002 à 15:10:39   

Reply

Marsh Posté le 03-01-2002 à 15:11:19    

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


---------------
Super.
Reply

Marsh Posté le 03-01-2002 à 15:13:17    

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;


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 03-01-2002 à 15:15:55    

c'est bien pour ca que je le fais ;)


---------------
Super.
Reply

Marsh Posté le 03-01-2002 à 15:18:43    

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:


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 03-01-2002 à 15:23:53    

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 ?

Reply

Marsh Posté le 03-01-2002 à 15:24:21    

Ben une boucle c'est pas la mort :??:


---------------
Super.
Reply

Marsh Posté le 03-01-2002 à 15:27:55    

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


---------------
What butter and whiskey won't cure, there is no cure for.
Reply

Marsh Posté le 03-01-2002 à 15:28:12    

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]


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 03-01-2002 à 15:28:50    

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

Reply

Marsh Posté le 03-01-2002 à 15:29:50    

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.


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 03-01-2002 à 15:32:08    

c vrai :jap:


---------------
What butter and whiskey won't cure, there is no cure for.
Reply

Marsh Posté le 03-01-2002 à 15:45:13    

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

Reply

Marsh Posté le 03-01-2002 à 15:50:59    

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


---------------
Super.
Reply

Marsh Posté le 03-01-2002 à 15:57:00    

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.

Reply

Marsh Posté le 03-01-2002 à 16:06:25    

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

Reply

Marsh Posté le 03-01-2002 à 16:07:26    

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

Reply

Marsh Posté le 03-01-2002 à 16:08:59    

ben  
if (pC == NULL)
{
 return false;
}
else
{
...
}
 
nan ??


---------------
Super.
Reply

Marsh Posté le 03-01-2002 à 19:47:58    

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

Reply

Marsh Posté le 03-01-2002 à 20:43:00    

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.


---------------
Pipiru piru piru pipiru pi
Reply

Marsh Posté le 03-01-2002 à 23:24:17    

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

Reply

Marsh Posté le 04-01-2002 à 21:14:12    

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]

Reply

Marsh Posté le 04-01-2002 à 22:19:09    

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

Reply

Marsh Posté le 04-01-2002 à 22:34:30    

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.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed