C++ : Effacer une zone mémoire à une adresse donnée - C++ - Programmation
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;
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 ...
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 ?
Marsh Posté le 06-04-2005 à 18:25:26
Sagoth a écrit : Bonjour. |
même pas utiliser un pointeur intelligent ?
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 ).
Marsh Posté le 06-04-2005 à 18:29:46
Sagoth a écrit : moi23372 Oui je sais, mon problème est différent. |
Quelle copie? qui a copié quoi que ce soit?
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.
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
Marsh Posté le 07-04-2005 à 09:36:08
Et le supprimer dans le destructeur de A-PERE c'est possible ?
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 )
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 ?
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 ;
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 !
Marsh Posté le 07-04-2005 à 17:06:49
donc on aura jamais un petit extrait de tes classes ou du code ?
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
Marsh Posté le 07-04-2005 à 19:06:54
HelloWorld a écrit : Ah oui, une sorte de... pointeur intelligent |
Je sens uhe dose de "mais çà fait 100 ans je vous le dis"
Marsh Posté le 07-04-2005 à 19:23:38
T'es un vrai petit devin toi, tu portes pas ce pseudo par hasard
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 : |
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.
Marsh Posté le 08-04-2005 à 08:45:45
Désolé pour le code, mais je travaille dessus seulement, il ne "m'appartient" pas.
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.