Accueil > Forum > > > > STL et std::bad_alloc en mode release
STL et std::bad_alloc en mode release
mercredi 26 août 2009 à 18:24:18 |
STL et std::bad_alloc en mode release

RV2931
|
Bonjour,
Je me heurte à un gros problème depuis quelques mois et, travaillant principalement en debug, je ne m'y était pas attardé mais celui-ci m'inquiétait tout de même pour le déploiement. Je suis sous Visual Studio C++ Express 2005, j'utilise l'API win 32 de base le sous système window, bref un projet Win32 graphique de base sans MFC ou toutes ces cochonneries.cela fait un an que je programme en C++/Qt/minGW et j'avoue que je ça me suffit parce que c'est génial, mais je suis, pour une seule application de mon projet, obligé de passer par Visual Studio.
Mon gros problème c'est que mon programme compile et fonctionne en Debug avec génération des informations de débugage et utilisation des DLL de débugage multithread (/MTd) exclusivement et compile en mode release, mais là ça plante à l'éxécution. J'ai donc rajouté l'option de génération des infos de débugage et il se trouve que ce sont les création d'objets de la STL map, string, sstream, vector et autres en allocation statique qui me font planter mon appli (std::bad_alloc ...).
J'ai cherché un peu et je suis tombé sur cet article là :
MSDN STL bad::alloc
Et là ça me fout une grosse claque. Mon projet VC++ commence à être conséquent et venant de la librairie "Framework" Qt avec qui tout est facile et déjà inventé, tout mon projet VC++ est basé sur l'utilisation des STL parce qu'à un moment faut arrêter de réinventer la roue... Et là, ça grosso modo l'article dit que la STL en projet VC++ sans MFC, sans .NET, un projet de base, l'opérateur new causerait des erreurs d'allocation mémoire en mode release. C'est hallucinant tout de même, je tombe vraiment de haut, même les truc légèrement évolués ne fonctionnent qu'à moitié sous windows...
J'ai pas très bien compris ce qu'il fallait faire pour éviter ça, l'article donne des solution suivant le type de projet utilisé, mais n'y a-t-il vraiment pas d'autre solution, c'est un problème aberrant auquel il doit bien y avoir une autre solution que de surcharger l'opérateur new tout de même ???? non ? genre mise à jour de librairie ou un truc comme ça
Moi je dis vive Qt, au moins ça ne fait pas semblant de simplifier la vie...
Je sais qu'il y a boost aussi, mais les types et l'utilisation des string, map et autres doivent être différent et ça m'embête de devoir remanier tout mon projet... si tant est qu'il n'y a pas le même problème
Une solution ???
Merci
Hervé
L'intelligence est la chose la mieux répartie chez l'homme, car quoi qu'il en soit pourvu, il a toujours l'impression d'en avoir assez. "Descartes"
|
|
mercredi 26 août 2009 à 22:01:34 |
Re : STL et std::bad_alloc en mode release

RV2931
|
En fait, je crée dans une classe
Code C/C++ :
class MyClass{
MyClass()
{
something or not...
}
map<string,int> [b]myMap[/b];
}
en mode release mais en générant les information de débugage afin d'utiliser les points d'arrêt, je n'atteins même pas le corps du constructeur, c'est bien que l'erreur se situe à la création même de l'instance de MyClass. Il se trouve que lorsque je supprime myMap et tout ce qui est STL, j'atteins enfin le corps du constructeur, cela prouve bien que c'est la création de ma std::map qui fait planter le truc.
Je précise cela car dans l'article cité ci-dessus, il parle de l'opérateur new, opérateur que je n'utilise pas explicitement puisque je crée myMap en statique mais la STL l'utilise sans aucun doute pour gérer dynamiquement la taille de myMap, avant même que j'y ajoute quelque chose.
Pouvez-vous bien me confirmer que c'est le même problème ? car comme je ne l'appelle pas explicitement et ne souhaite pas le faire puisque ça complique la syntaxe, je ne vois pas comment pourquoi j'aurai à surcharger l'opérateur new.
Boost est-elle une lib qui se base sur la STL ? car dans ce cas je crains de finir par avoir le même genre de problème...
Merci
L'intelligence est la chose la mieux répartie chez l'homme, car quoi qu'il en soit pourvu, il a toujours l'impression d'en avoir assez. "Descartes"
|
|
samedi 29 août 2009 à 10:08:45 |
Re : STL et std::bad_alloc en mode release

rt15
|
Salut,
If you are one of them and are using STL and Visual C++ 6.0 directly out of the box, your application is at high risk of crashing under low memory conditions.
De ce que je l'ai parcourut, l'article explique surtout que Visual Studio 6 renvoyait NULL lors de l'échec d'une allocation, alors que les versions ultérieures déclenchent une exception, comme la norme le stipule.
Quoiqu'il en soit, les problèmes surviennent lorsqu'une allocation échoue.
Et ça, en natif sous Windows, c'est extrêmement rare. Il faut vraiment pousser le PC dans ses retranchements.
Autrement dit, il y a un problème dans ton code ou dans la STL. Mais sachant que la STL est utilisée intensivement, et est de bien meilleur qualité sous 2005 que sous VC6, il est plus probable qu'il se situe dans ton code.
Globalement, pour qu'une allocation échoue, il y a deux causes :
1) Le système d'exploitation ne peut plus trouver de mémoire.
2) La taille de mémoire contigüe demandée est trop grande.
3) Le tas est en vrac.
Le premier cas se voit rapidement. Le PC est à genou : ralentissement, saccades, peu de réactivité... La mémoire consommée visible dans le gestionnaire des tâches est largement supérieure à la quantité de RAM disponible (Parfois 3 ou 4 fois plus de mémoire consommée que de RAM). La mémoire virtuelle est pleine elle aussi et Windows tente désespérément d'augmenter sa taille. Pour que ce problème survienne, il faut qu'il y ait une grande quantité d'allocations de bonne taille. Cela peut avoir lieu en cas de récursivité. Par exemple, si une string à besoin d'une string pour être construite, on va bouffer toute la mémoire. Cela peut bien sûr aussi avoir lieu si le logiciel manipule une grande quantité de données, ou en cas de fuite de mémoire.
Le deuxième cas peut survenir alors que le PC est moins chargé. Si on demande 4Go de mémoire contigüe, on les a pas, c'est tout, peu importe la charge. Cela signifie que d'une manière ou d'une autre : Allocation d'une matrice 1000000 * 1000 entiers, écrasement mémoire provoquant une demande de mémoire de taille erronée, calcul de taille mal codé (genre int i; int* titi = new int[i]; sans i initialisé)...
Le troisième cas, c'est quand on a cassé le tas. On a écrit là où le gestionnaire de tas du C++ a écrit des infos sur son tas. Bilan il ne s'y retrouve plus. Ca arrive quand on écrit à côté de zones allouées, par exemple en dépassant les bornes d'un tableau.
Bilan, il faut que tu regardes l'état de la mémoire de ton PC. S'il n'y a rien de suspect, il faut que tu fasses des investigations pour déterminer quelle allocation déclenche l'exception, ou s'il y en a plusieurs.
|
|
lundi 31 août 2009 à 00:17:01 |
Re : STL et std::bad_alloc en mode release

mezaya
|
std::map et la STL en général marche très bien, des milliers de gens l'utilisent tous les jours, il y a pas de soucis à ce faire de ce coté la.
maintenant pour ton problème, je penche plutôt pour une corrumption du tas (vérifie comme même que ton process ne bouffe pas 2 Go ). tu peux checker en debug l'intégrité du tas pas la fonction "_CrtCheckMemory" ou bien par la fonction "_CrtSetDbgFlag" qui permet de vérifier ton tas toutes les X allocations.
|
|
lundi 31 août 2009 à 00:20:19 |
Re : STL et std::bad_alloc en mode release

mezaya
|
ah, j'ai oublié un peu de doc pour ces fonctions : ici
|
|
lundi 31 août 2009 à 01:55:02 |
Re : STL et std::bad_alloc en mode release

RV2931
|
Merci,
Je penche aussi pour un problème de new et/ou delete quelque part, mais j'en fait tellement peu, grâce à l'utilisation de la STL justement, que c'est vraiment pas de bol. Merci en tout cas pour ces infos et explications
L'intelligence est la chose la mieux répartie chez l'homme, car quoi qu'il en soit pourvu, il a toujours l'impression d'en avoir assez. "Descartes"
|
|
Cette discussion est classée dans : projet, mode, stl, alloc, bad
Répondre à ce message
Sujets en rapport avec ce message
pour les modes vga (lisez svp) [ par goldocrack ]
Il faut mettre 0x13 dans AX pour un mode vga 300*200 256 couleurs mais quels sont les autres modes vga et leurs correspondances en hexa ???Quel est la
pour les modes vga (lisez svp) [ par goldocrack ]
Il faut mettre 0x13 dans AX pour un mode vga 300*200 256 couleurs mais quels sont les autres modes vga et leurs correspondances en hexa ???Quel est la
Référence indéfinie stl_alloc.h [ par CasseTaTele ]
Bonjour,J'essaye de compiler un programme c/c++ sous linux ubuntu mais le link plante sur une bibliothèque de la caméra que j'utilise.J'ai un problème
demarer une application en mode masqué [ par baby3378 ]
Bonjour à tous, voila j'ai un petit souci : j'ai créé un projet (sous forme de console). Je l'ai ajouté dans ma base de registre afin qu'il demare en
jeu "chiffre exact" [ par zkenpachi ]
salut tout le monde j'aimerais bien que vous m'aidiez a réalisé un projet il s'agit du jeu "chiffre exact" je sais même pas de quoi je vais commence
Besoin d'aide sur un projet simple [ par numka ]
Bonjour, je suis donc en BTS et j'ai un projet a réaliser, seulement je ne sais pas comment commencer...je veux récupérer des données qui se trouve su
création d'un filtre DirectShow pour un codec H.264 [ par wafabmed ]
Je voudrai faire un filtre DShow ( DirectShow) pour un codec H.264 en se basant sur le projet FFmpeg (décodeur) et le projet X264 (codeur).Le problème
Utiliser des dll dans un projet VS 2005 avec MFC [ par ebrainis ]
Salut à tous, Je doit controller un hardware fourni avec une dll. J'ai crée un interface graphique avec VS et les MFC. Parcontre, quand j'essaye d'ut
Créationn d'un editeur de resource comment faire? [ par babyboo1107 ]
Bonjour à tous, voilà , dans le cadre d'un projet de fin d'étude j'aimerais créer un éditeur de ressource, mais voilà je n
Livres en rapport
|
Derniers Blogs
POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc
Forum
MATLAB PROGRAMME MATLAB PROGRAMME par wahab1087
Cliquez pour lire la suite par wahab1087 RGB2GRAYRGB2GRAY par musa18
Cliquez pour lire la suite par musa18
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|