C++ : Effacer une zone mémoire à une adresse donnée

C++ : Effacer une zone mémoire à une adresse donnée - C++ - Programmation

Marsh Posté le 06-04-2005 à 16:00:20    

Bonjour.
 
J'ai un problème concernant une zone mémoire en C++
 
J'ai un objet A de type tA.
 
j'enregistre l'adresse de cet objet dans une variable B  (un int).
 
L'objet A est mis a NULL mais non effacé de la mémoire (oui, c'est étrange mais je ne peux pas faire autrement dans mon cas de figure)
 
Du coup j'aurais aimé pouvoir effacer   les données restantes de mon objet A qui sont à l'adresse enregistrée dans B.
 
Est ce possible ?  
 
J'imagine une commande de type "delete", mais je ne parvient pas a indiquer au programme "efface à l'adresse contenue dans la valeur B"
 
 
PS : je reprécise bien que je ne veux pas effacer l'objet A directemet.
Je veux bien enregistrer son adresse et l'effacer ensuite apres d'autres traitement.
 
 

Reply

Marsh Posté le 06-04-2005 à 16:00:20   

Reply

Marsh Posté le 06-04-2005 à 16:40:17    

en c++ pour faire l'allocation et la désallocation c'est comme ça:
 
ex:
 
pour allouer:
int *nombre = new int();
 
pour désallouer:
delete nombre;

Reply

Marsh Posté le 06-04-2005 à 16:43:37    

je n'ai que de "vieux" souvenir de C/C++, mais un truc style :
 
for (i=0; i< sizeof(tA) ; i++) {
  *B++ = null;
}
 
ca marcherais pas ?
 
Remarque, j'ai toujours été nul en C ...


Message édité par tuxbleu le 06-04-2005 à 16:44:42
Reply

Marsh Posté le 06-04-2005 à 16:51:24    

ta * nouveaupointeur= (ta*) b;
delete nouveaupointeu;
:??:

Reply

Marsh Posté le 06-04-2005 à 18:20:50    

moi23372 Oui je sais, mon problème est différent.
tuxbleu Non, NULL ne signifie pas que l'on desalloue
belgique Je vais essayer mais j'ai bien peur qu'à ce moment là j'efface seulement la recopie.
 
C'est plus compliqué que cela en à l'air non ?

Reply

Marsh Posté le 06-04-2005 à 18:25:26    

Sagoth a écrit :

Bonjour.
 
J'ai un problème concernant une zone mémoire en C++
 
J'ai un objet A de type tA.
 
j'enregistre l'adresse de cet objet dans une variable B  (un int).
 
L'objet A est mis a NULL mais non effacé de la mémoire (oui, c'est étrange mais je ne peux pas faire autrement dans mon cas de figure)


 
même pas utiliser un pointeur intelligent ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 06-04-2005 à 18:28:52    

Ca veut dire quoi mis à NULL ?
 
Sinon, pour effacer la mémoire, je vois un truc du genre : fill( B, B+sizeof(ta), 0 ).

Reply

Marsh Posté le 06-04-2005 à 18:29:46    

Sagoth a écrit :

moi23372 Oui je sais, mon problème est différent.
tuxbleu Non, NULL ne signifie pas que l'on desalloue
belgique Je vais essayer mais j'ai bien peur qu'à ce moment là j'efface seulement la recopie.
 
C'est plus compliqué que cela en à l'air non ?


 
Quelle copie? qui a copié quoi que ce soit?

Reply

Marsh Posté le 06-04-2005 à 18:29:53    

J'ai l'impression que tu souhaites desallouer un objet A qui n'est pas alloué dynamiquement... ton explication n'est pas claire.

Reply

Marsh Posté le 07-04-2005 à 09:26:16    

xterminhate a écrit :

J'ai l'impression que tu souhaites desallouer un objet A qui n'est pas alloué dynamiquement... ton explication n'est pas claire.


 
Oui, désolé, j'ai un peu de mal à l'expliquer. Je vais préciser.
 
A est bien alloué dynamiquement.
 
Le problème est qu'à un certain moment j'effectue un delete sur un autre objet (disons A-PERE) contenant mon objet A.
Ce qui se passe alors c'est que A n'est pas désaloué.
 
De plus A est alloué plusieurs fois avant le delete de A-PERE, et je ne  dois pas "deleter" le premier de ces objet A tant que A-PERE existe.
 
Bon, je suis désolé, c'est un gros merdier et si j'avais pu éviter ces bidouilles à 2 kopek je l'aurais fait ;)
 
Je vais essayer de me demmerder :)
 
PS : peut etre que ta solution fonctionne Belgique en fait, je vais creuser

Reply

Marsh Posté le 07-04-2005 à 09:26:16   

Reply

Marsh Posté le 07-04-2005 à 09:36:08    

Et le supprimer dans le destructeur de A-PERE c'est possible ?

Reply

Marsh Posté le 07-04-2005 à 10:35:14    

poste tes classes et du code.

Reply

Marsh Posté le 07-04-2005 à 10:41:08    

xterminhate a écrit :

Ca veut dire quoi mis à NULL ?


T'as variable ne vaut rien, elle est vide (elle ne vaut surtout pas 0). Par contre, elle prends le  même espace mémoire. (dites le moi si je dit nimp :p )

Reply

Marsh Posté le 07-04-2005 à 11:04:20    

Je repose ma question : un pointeur intelligent ne résoudrait-il pas proprement et de manière fiable ton problème ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 07-04-2005 à 13:08:46    

Sagoth : si je comprend bien ton problème est que plusieurs objet font référence à A et donc quand tu supprime un objet qui faitréférence à A tu ne veut pas le supprimer à moins que ce soit le dernier y faisant référence ?
 
Tu pourrais mettre dans A un entier qui indique le nombre d'objet référençant celui-ci et à chaque appel des destructeurs des objets pointant sur A tu décrémente cet entier, et pdt les constructeur t'incrémente.
 
CMk, xterminhat  : NULL est la valeur que l'on assigne à un pointeur pour dire qu'il ne pointe sur rien (interdiction de faire delete NULL) etsinon le pointeur NULL à pour valeur booléenne false :  
if (my_ptr)
delete my_ptr ;

Reply

Marsh Posté le 07-04-2005 à 13:12:50    

delete NULL est légal.

Reply

Marsh Posté le 07-04-2005 à 16:16:21    

Oui, bien sur il y aurait moyen de programmer un truc bien plus propre.
 
Le problème est que je dois seulement mettre à jour ce soft, qui à la base n'avais pas été concu pour gérer plusieurs objets (en l'occurence des instances de classes images propriétaires) à la fois mais un seul.
 
Sachant que je dois garder une compatibilité avec l'existant, je me retrouve avec un merdier sans nom.
 
Sinon pour résumer, en gros je voulais supprimer l'ancienne allocation d'objets qui ont été réalloués entre temps; objets qui bien entendu (se serait trop simple) ne peuvent être "deleted" avant cette réallocation et qui restent donc en mémoire.
 
Bref, c'est je pense une voie de garage, je vais essayer d'attaquer le pb par un autre coté.
 
En tout cas merci pour vos remarques et suggestions !
 
 
 

Reply

Marsh Posté le 07-04-2005 à 17:06:49    

donc on aura jamais un petit extrait de tes classes ou du code ?

Reply

Marsh Posté le 07-04-2005 à 17:31:49    

LordHarryPotter a écrit :

Tu pourrais mettre dans A un entier qui indique le nombre d'objet référençant celui-ci et à chaque appel des destructeurs des objets pointant sur A tu décrémente cet entier, et pdt les constructeur t'incrémente.


 
Ah oui, une sorte de... pointeur intelligent
http://www.boost.org/libs/smart_ptr/shared_ptr.htm
 
:sarcastic:  


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 07-04-2005 à 19:06:54    

HelloWorld a écrit :

Ah oui, une sorte de... pointeur intelligent
http://www.boost.org/libs/smart_ptr/shared_ptr.htm
 
:sarcastic:


 Je sens uhe dose de "mais çà fait 100 ans je vous le dis"  :kaola:

Reply

Marsh Posté le 07-04-2005 à 19:23:38    

T'es un vrai petit devin toi, tu portes pas ce pseudo par hasard ;)


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 07-04-2005 à 23:19:42    

LordHarryPotter a écrit :

CMk, xterminhat  : NULL est la valeur que l'on assigne à un pointeur pour dire qu'il ne pointe sur rien (interdiction de faire delete NULL) etsinon le pointeur NULL à pour valeur booléenne false :  
if (my_ptr)
delete my_ptr ;


Si tu relis bien ce qui est dit : "L'objet A est mis à NULL [...]". Il ne parlait pas d'un pointeur sur A, d'où ma quetion.
 
Cela dit, ton bout de code.... hum, t'es pas sérieux quand même. On prefera 0 à la place de NULL en C++. Et delete 0 n'a jamais fait de mal a personne.

Reply

Marsh Posté le 08-04-2005 à 08:45:45    

Désolé pour le code, mais je travaille dessus seulement, il ne "m'appartient" pas.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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