Allocations mémoire pour stl::map [C++] - C++ - Programmation
Marsh Posté le 28-02-2005 à 11:57:36
Citation : |
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 ?
Marsh Posté le 28-02-2005 à 12:06:56
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 :
|
plutot que
Code :
|
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é...
Marsh Posté le 28-02-2005 à 12:09:57
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
Marsh Posté le 28-02-2005 à 12:21:17
kowalski a écrit : |
bin elle enfle tout seule comme une grande
taz a raison, un brin de code pour eclaircir tout ca serait le bienvenue
Marsh Posté le 28-02-2005 à 12:25:29
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à)
Marsh Posté le 28-02-2005 à 13:43:50
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
Marsh Posté le 28-02-2005 à 13:45:48
aucune. Encore faut-il que tu utilises une classe de string potable, genre std::string. operator [] des maps, C'EST un insert
Marsh Posté le 28-02-2005 à 13:55:08
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...
Marsh Posté le 28-02-2005 à 14:07:17
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é)
Marsh Posté le 28-02-2005 à 16:01:51
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...
Marsh Posté le 28-02-2005 à 16:16:52
nan, t'es surement pas tiré d'affaire
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.
Marsh Posté le 28-02-2005 à 16:17:51
vérifie que tu fais pas n'importe quoi avec tes itérateurs si tu en utilises
Marsh Posté le 28-02-2005 à 16:22:57
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...
Marsh Posté le 28-02-2005 à 16:24:57
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";
Marsh Posté le 28-02-2005 à 16:26:31
mais tu fais quoi quand tu vas du begin() au end() ?
bon tu le sors quand ton debugger ?
Marsh Posté le 28-02-2005 à 16:31:13
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
Marsh Posté le 28-02-2005 à 16:34:58
et essaie d'isoler une fonction qui foire et file la nous
Marsh Posté le 01-03-2005 à 10:10:06
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
Marsh Posté le 02-03-2005 à 12:49:58
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 ?
Marsh Posté le 02-03-2005 à 13:25:21
y a rien à faire. ça peut venir que de toi. vérifies tous tes destructeurs, operator=, constructeur de copie, etc
Marsh Posté le 28-02-2005 à 11:54:00
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...