tit pb de désallocation avec delete

tit pb de désallocation avec delete - C++ - Programmation

Marsh Posté le 22-02-2003 à 16:38:31    

voila, g une variable, str.
 
je doit détruire str qui est une chaine de caractère : char* str
 
le problème c'est que str peut avoir été crée comme ca :
 
char* str = new char[30];
strcpy(str, "fdsqfsdq" );
 
mais aussi comme ca
char* str = "fdsqfdsq";
 
dans le dernier cas, je ne peux pas la détruire, alors que dans le 1er cas je peux la détruire avec delete.
 
Comment savoir si je peux la détruire avec delete ou pas ?
(si je la détruis avec delete alors qu'elle est créée selon le 2eme cas, ca me fait un exception)


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 22-02-2003 à 16:38:31   

Reply

Marsh Posté le 22-02-2003 à 16:50:59    

Avec la majorité des compilateurs, les textes écrits en dur (entre guillemets) dans le code sont placés dans une zone readonly à l'éxécution. Il ne faut donc pas chercher à les libérer.
 
En règle générale, tout ce qui n'a pas été clairement alloué avec new ne doit pas être passé par delete.


Message édité par schnapsmann le 22-02-2003 à 16:51:33

---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 22-02-2003 à 16:53:25    

oui, justement, ca je l'ai bien compris, et je cherche justement à savoir si mon texte a été alloué avec new ou pas.


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 22-02-2003 à 16:57:58    

A ma connaissance il n'y a pas de moyen simple. Les allocateurs standard du C et du C++ ne fournissent pas de fonctions du genre bool is_deletable(void* mem_zone, int size)...


Message édité par schnapsmann le 22-02-2003 à 16:58:24

---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 22-02-2003 à 17:17:47    

ah ... merde ... je peux p-e regarder si la zone de mémoire est read-only on si on peut ecrire dessus ... mais je connais mm pas sa taille ...


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 22-02-2003 à 17:41:56    

c'est quoi cette obscession de toute détruire: ne detruis que ce que tu construis
ne désalloue que ce que tu alloues
 
l'utilisation de delete est symétrique avec celle de new
 
dans le cadre de ton problème, il serait peut etre mieux de faire
 
std::string str("fdsqfsdq" );
 
ne serait ce pas un post de masturbation intellectuelle de newbie? :D  
 
ton texte en dure, comme dit plus haut, il est sans doute alloué à la compilation dans une zone statique et read-only. si tu veux t'en assurer, prends un editeur hexa (ou strings a.out).
comme cette zone est read-only, un const est le bienvenue
 
const char *str="dawa";
 
edit: si tu veux la taille des différents segments de ton binaire: size a.out


Message édité par Taz le 22-02-2003 à 17:43:19
Reply

Marsh Posté le 22-02-2003 à 17:55:01    

sous win32 il y a lgtps que g désassemblé un prog et que g constaté que lorsqu'on fait char* str = "fdsqfqs"; str renvoit directement dans l'emplacement mémoire ou a été chargé le segment de données de l'executable, au debut de la chaine dans cette emplacement mémoire, donc je savais tres bien qu'il etait impossible de détruire ca (cet emplacement mémoire est verrouillé avec l'attribut read-only).
 
En fait, mon probleme est que j'ai créé une boucle de message ou d'un coté on peut donc sotcker des message, et de l'autre coté les retirer. le probleme est que les messages stocké peuvent contenir des chaines alloué, et des chaines statiques, et pour qu'il n'y ait pas de fuite de mémoire, la partie qui retire les messages doit donc détruire les chaines allouées.
 
il me semble avoir trouvé une solution (sous win32 tjs) en utilisant les API HeapAlloc et HeapFree. HeapFree retourne FALSE si il ne peut pas libérer la mémoire (donc une chaine statique) au lieu de produire une exception.
 
j'ai regardé, mon compileur les allocation de new dans le heap aussi, donc ca devrait a peu pret resoudre mon probleme.


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 22-02-2003 à 17:55:32    

ne serait ce pas un post de masturbation intellectuelle de newbie?  :D  
 
euh, si, c exactement ca :p


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 22-02-2003 à 17:59:50    

murf ... en fait HeapFree fait une exception aussi qd il n'arrive pas a désallouer ...


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 22-02-2003 à 18:11:16    

dit "désallouer" et pas "detruire"
 
tu ne peux pas désallouer une chaine litterale puisqu'elle n'est en zone statique qui est valide durant toute la vie du processus.
 
si tu veux faire un traitement ou systématiquement tu libères la zone pointée, et ben tu fais une copie comme dans ton premier post. mais pourquoi utiliser les char*, surtout qu'apparement certains aspects te dépassent. avec les string, tu n'as a te soucier que du traitement des données

Reply

Marsh Posté le 22-02-2003 à 18:11:16   

Reply

Marsh Posté le 22-02-2003 à 21:34:50    

Tu peux faire une variable marqueur qui indique si la dernière affectation au pointeur a nécessité une allocation programmée ou pas.
 
Sinon, si la chaîne littérale que tu as tapée en dur dans ton code est unique, c a d ne risque pas d'être autre part dans une zone mémoire allouée par tes soins, si ton pointeur pointe vers elle, tu sauras reconnaitre son contenu vu que la chaine ne sera jamais modifiée, et tu sais donc si tu dois libérer ou pas.

Reply

Sujets relatifs:

Leave a Replay

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