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

  FORUM HardWare.fr
  Programmation
  C++

  [C++] Allocations mémoire pour stl::map

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++] Allocations mémoire pour stl::map

n°995599
kowalski
Posté le 28-02-2005 à 11:54:00  profilanswer
 

Toujours dans le même projet pour ceux qui suivent mes péripéties, j'ai maintenant bcp de map qui se remplissent, et qui apparemment au bout d'un moment, font n'importe quoi...
 
Au début en déclaration, j'utilisais betement
var["blabla"] = "blabli";
 
Je ne savais pas si le pauvre saurait comment réserver de l'espace, alors comme ca plantait allègrement (La mémoire ne peut pas etre "read" ), je suis passé aux insert, value_type etc...
Mais sans succès, même plantage.
 
J'imagine que j'ai bcp de données déjà en mémoire à l'instant du lancement (et encore, j'ai des doutes)
 
En fait ce qui me gène, c'est que si je déclare un map :
 
map <int, string> mamap;
 
je peux la passer en paramètre à mes fonctions de remplissage
 
Mais si je la déclare avec son constructeur,
 
map <int, string> mamap();
 
pour évidemment la détruire proprement ensuite, je n'arrive pas à passer ma structure (mais si vous me donnez une syntaxe adéquate j'achète)
 
Bon, ce topic est très fouilli j'en suis désolé mais je suis un peu perdu...

mood
Publicité
Posté le 28-02-2005 à 11:54:00  profilanswer
 

n°995601
Taz
bisounours-codeur
Posté le 28-02-2005 à 11:57:34  profilanswer
 

du code :o

n°995602
chrisbk
-
Posté le 28-02-2005 à 11:57:36  profilanswer
 

Citation :


Je ne savais pas si le pauvre saurait comment réserver de l'espace, alors comme ca plantait allègrement (La mémoire ne peut pas etre "read" ), je suis passé aux insert, value_type etc...


 
a mon avis tu merdouilles salement, et ce sans rapport avec ta map
 
 

Citation :

je peux la passer en paramètre à mes fonctions de remplissage


 
tu la passes pas par copie, hein ? :d

n°995612
kowalski
Posté le 28-02-2005 à 12:06:56  profilanswer
 

Bien sur que non je ne passe pas ma map par copie, c'est juste que si je déclare la map avec son constructeur, il me refuse de passer la map aux fonctions (erreur du compilateur).
 
Le code en général est propre, mais je débute avec la STL, alors j'hésitais à affecter dans ma map en faisant

Code :
  1. map[1] = "mavaleur1";


plutot que  

Code :
  1. map.insert(montypedemap::value_type(1, "mavaleur1" ));


 
Si après vous me dites que point de vue allocation mémoire, c'est la même chose, je cherche d'un autre côté...


Message édité par kowalski le 28-02-2005 à 12:08:31
n°995615
kowalski
Posté le 28-02-2005 à 12:09:57  profilanswer
 

Pour le merdouillage, c'est surtout au niveau de ma manière de m'exprimer je pense...
 
Mes maps sont assez grosses (et je ne peux rien y faire, même problèmes qu'avec mes structures à l'époque), et à aucun moment je ne lui dit combien d'espace réserver et je trouve ca étrange

n°995620
chrisbk
-
Posté le 28-02-2005 à 12:21:17  profilanswer
 

kowalski a écrit :


Mes maps sont assez grosses (et je ne peux rien y faire, même problèmes qu'avec mes structures à l'époque), et à aucun moment je ne lui dit combien d'espace réserver et je trouve ca étrange


 
bin elle enfle tout seule comme une grande [:spamafote]
 
taz a raison, un brin de code pour eclaircir tout ca serait le bienvenue

n°995622
kowalski
Posté le 28-02-2005 à 12:25:29  profilanswer
 

Si je poste du code, je dois bcp enlever pour que ca soit "postable"...
 
Je vais essayer de chercher encore un peu et sinon j'écremerais et je posterai...
 
Mon plantage a lieu entre deux ajouts dans une de mes 4 maps (et en tout début...) (je viens de le confirmer là)

n°995701
Taz
bisounours-codeur
Posté le 28-02-2005 à 13:41:04  profilanswer
 

on a toujours rien compris.

n°995704
kowalski
Posté le 28-02-2005 à 13:43:50  profilanswer
 

Ma question est simple :
 
Y-a-t'il une différence quant à la gestion de l'allocation mémoire si je fais :
 
map[1] = "mavaleur1";
 
 
plutot que  
 
map.insert(montypedemap::value_type(1, "mavaleur1" ));  
 
Pour le reste, je ne sais pas d'où vient de problème

n°995709
chrisbk
-
Posté le 28-02-2005 à 13:45:29  profilanswer
 

bof, non

mood
Publicité
Posté le 28-02-2005 à 13:45:29  profilanswer
 

n°995711
Taz
bisounours-codeur
Posté le 28-02-2005 à 13:45:48  profilanswer
 

aucune. Encore faut-il que tu utilises une classe de string potable, genre std::string.  operator [] des maps, C'EST un insert

n°995725
kowalski
Posté le 28-02-2005 à 13:55:08  profilanswer
 

J'utilise std:string
Merci pour la réponse sur le Insert
 
Je continue de chercher d'où peut venir le problème dans ce cas...

n°995739
++fab
victime du syndrome IH
Posté le 28-02-2005 à 14:07:17  profilanswer
 

le insert (que tu emploie), ça renvoie une pair<iterator,bool>
pour savoir si l'élément a bien été inséré, et avoir un iterator dessus.
operator[], ça écrase l'ancienne valeur par la nouvelle (correspondant à la meme clé)

n°995944
kowalski
Posté le 28-02-2005 à 16:01:51  profilanswer
 

Merci à tous
Je pense - je ne suis pas expert, certains d'entre vous l'auront compris - que cette journée de recherche de bug a porté ses fruits...
sans rentrer dans les détails (ce serait inutile, long et chiant), Il m'a suffit de créer un élement supplémentaire dans une des maps pour que tout fonctionne sans aucun soucis. Ca n'a aucun sens... Le compilateur peut-il avoir des soucis d'adressage ? (surtout si on l'embete avec des pragma pack() ?)
 
Je suis tiré d'affaire, mais pas vraiment satisfait, j'aurais préféré trouver une grosse erreur de ma part...

n°995971
++fab
victime du syndrome IH
Posté le 28-02-2005 à 16:16:52  profilanswer
 

nan, t'es surement pas tiré d'affaire  :sweat:  
Avant d'incriminer le compilateur (ou std::map ...), regarde s'il y a pas qqchose de moisi dans ton code, et dans le doute, poste le.

n°995973
Taz
bisounours-codeur
Posté le 28-02-2005 à 16:17:51  profilanswer
 

vérifie que tu fais pas n'importe quoi avec tes itérateurs si tu en utilises

n°995979
kowalski
Posté le 28-02-2005 à 16:22:57  profilanswer
 

Exact, je ne le suis pas du tout
 
Il doit effectivement y avoir quelque chose de vraiment pas beau du tout...
 
Pour le moment je ne peux pas poster, mais si j'arrive à isoler qqch je le ferai.
 
Y-a-t'il une mémoire maxi allouée à un programme console qui sort de decC++ ?
Il est dans les adresse 0x0022.... et tout d'un coup il passe à 0x6d6f6320 (adresse de l'erreur), (une affectation plus tard, aucun code entre...) ou 0x00001000 par ex
 
Si l'ordre des mes fonctions varient, le programme ira plus ou moins loin...

n°995983
kowalski
Posté le 28-02-2005 à 16:24:57  profilanswer
 

Taz a écrit :

vérifie que tu fais pas n'importe quoi avec tes itérateurs si tu en utilises


 
Au moment précis ou ca plante je n'utilise pas d'itérateur, je fais des affectation en dur type, mais c'est vrai que j'en utilise à d'autres, moment... Quels sont les types d'erreurs à ne pas commetre ? Je vais systématiquement du begin() au end()
 
mamap[1] = "valeur1";
 
<plantage>
 
mamap[2] = "valeur2";

n°995985
Taz
bisounours-codeur
Posté le 28-02-2005 à 16:26:31  profilanswer
 

mais tu fais quoi quand tu vas du begin() au end() ?
 
bon tu le sors quand ton debugger ?

n°995993
kowalski
Posté le 28-02-2005 à 16:31:13  profilanswer
 

En effet, je vais me documenter sur le debugger de devc++ (à moins que vous ayez autre chose en tete)
 
J'ai essayé de le faire tourner, mais ca ne donne pas grand chose
 
Pour l'itérateur, j'en ai pas mal, mais vraiment les endroits ont se font les erreurs n'en contiennent pas

n°996003
Taz
bisounours-codeur
Posté le 28-02-2005 à 16:34:58  profilanswer
 

et essaie d'isoler une fonction qui foire et file la nous

n°996850
kowalski
Posté le 01-03-2005 à 10:10:06  profilanswer
 

Je pense avoir résolu mon problème. Une map qui me permettait de traiter les bits d'un champ était rempli à chaque appel du décodage (ie... qq centaines de fois min) avec à chaque fois une 30aine de valeurs (vidée à chaque fois)
Maintenant elle est appellée une seule fois mais contient 100 valeurs, Je sens en meme temps que le prog s'execute bcp plus vite... Ce décodage n'était pas prévu dans mon analyse de départ et c'est pour ca que je l'ai placé un peu au hasard

n°998170
kowalski
Posté le 02-03-2005 à 12:49:58  profilanswer
 

C'est dingue, tout fonctionnait bien, mais je me suis dit pour voir un peu la robustesse du programme, que j'allais lancer 100x de suite la procédure (en fait une fonction qui en appelle bcp d'autres) pour voir si tout se passe bien
 
Au 84e passage, BAM ! Les données qui devaient s'afficher dans un fichier apparaissent à l'écran, gros n'importe quoi, des bip du PC qui hurle à l'aide...
 
J'ai fait un gros effort, je suis repassé sur tout le code pour etre sur de bien faire des new/delete sur mes grosses structures...
 
Je pense qu'un pointeur prend l'adresse de mon fichier (mais je ne vois pas à quel moment il pourrait avoir si peu de mémoire : dans le gestionnaire des taches, mon appli fait 1264 ko en mémoire et varie très peu, ca veut donc dire à mon sens que la mémoire est bien libérée et réallouée à chaque fois !)
 
Vous allez me demander le code, je vais vous répondre que je ne peux pas et je suis désolé. Taz me disait que ca ressemblait à un probleme d'itérateur...
 
est ce que clear() d'une map libère toutes les ressources ou reste-t-il quelque chose à faire ?

n°998196
Taz
bisounours-codeur
Posté le 02-03-2005 à 13:25:21  profilanswer
 

y a rien à faire. ça peut venir que de toi. vérifies tous tes destructeurs, operator=, constructeur de copie, etc

mood
Publicité
Posté le   profilanswer
 


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

  [C++] Allocations mémoire pour stl::map

 

Sujets relatifs
probleme allocation memoireAccess 2000 :Mémoire libre insuffisante pour mettre à jour l'affichage
Garder le résultat d'une requete en mémoire avec PHP Part 2 [Résolu]Ecrire un conteneur STL dans une mémoire partagée
Garder le résultat d'une requete en mémoire avec PHPUtilisation mémoire importante
Chargement d'un programme en mémoireLibération de mémoire qui ne se fait pas...
[C] fork() - étudier la mémoireEspace mémoire saturé
Plus de sujets relatifs à : [C++] Allocations mémoire pour stl::map


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