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

  FORUM HardWare.fr
  Programmation
  C++

  tit pb de désallocation avec delete

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

tit pb de désallocation avec delete

n°315549
blackgodde​ss
vive le troll !
Posté le 22-02-2003 à 16:38:31  profilanswer
 

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 )-
mood
Publicité
Posté le 22-02-2003 à 16:38:31  profilanswer
 

n°315554
schnapsman​n
Zaford Beeblefect
Posté le 22-02-2003 à 16:50:59  profilanswer
 

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!"
n°315555
blackgodde​ss
vive le troll !
Posté le 22-02-2003 à 16:53:25  profilanswer
 

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


---------------
-( BlackGoddess )-
n°315557
schnapsman​n
Zaford Beeblefect
Posté le 22-02-2003 à 16:57:58  profilanswer
 

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!"
n°315561
blackgodde​ss
vive le troll !
Posté le 22-02-2003 à 17:17:47  profilanswer
 

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 )-
n°315566
Taz
bisounours-codeur
Posté le 22-02-2003 à 17:41:56  profilanswer
 

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
n°315569
blackgodde​ss
vive le troll !
Posté le 22-02-2003 à 17:55:01  profilanswer
 

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 )-
n°315570
blackgodde​ss
vive le troll !
Posté le 22-02-2003 à 17:55:32  profilanswer
 

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


---------------
-( BlackGoddess )-
n°315573
blackgodde​ss
vive le troll !
Posté le 22-02-2003 à 17:59:50  profilanswer
 

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


---------------
-( BlackGoddess )-
n°315580
Taz
bisounours-codeur
Posté le 22-02-2003 à 18:11:16  profilanswer
 

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

mood
Publicité
Posté le 22-02-2003 à 18:11:16  profilanswer
 

n°315662
leneuf22
Posté le 22-02-2003 à 21:34:50  profilanswer
 

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.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  tit pb de désallocation avec delete

 

Sujets relatifs
[Mysql] pb DELETE"DELETE FROM `guest` WHERE `id` ='$id' LIMIT 1"; ca ne marche pa :cry:
MySQL + REQUETE DELETE AVEC IMBRICATION !!!! HELP !!!!!!!C++ : delete d'un char * : quelle est la bonne solution ?
pb avec la fonction DELETE ds une BdDpb mysql / PHP avec la fonction DELETE
[mac C C++ ] Help , j y arrive pas:allocation /desallocation imageDelete et tableau de pointeurs
URGENT : implementations de new, new[], delete, delete[] en C++ embarqpetit probleme avec requete Delete je pense facile mais je vois pas
Plus de sujets relatifs à : tit pb de désallocation avec delete


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR