logo

FAQ C++Consultez toutes les FAQ

Nombre d'auteurs : 34, nombre de questions : 368, derni鑽e mise ? jour : 14 novembre 2021 Ajouter une question

Cette FAQ a 騁? r饌lis馥 ? partir des questions fr駲uemment pos馥s sur les forums de http://www.developpez.com et de l'exp駻ience personnelle des auteurs.

Je tiens ? souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose sont correctes ; les auteurs font le maximum, mais l'erreur est humaine. Cette FAQ ne pr騁end pas non plus 黎re compl鑼e. Si vous trouvez une erreur ou si vous souhaitez devenir r馘acteur, lisez ceci.

Sur ce, nous vous souhaitons une bonne lecture.

SommaireProbl鑪es avec les compilateurs (9)

Parfois, on est confront? ? des probl鑪es tr鑚 騁ranges et apparemment sortis de nul part :

  • plantage Access Violation, core dump, null pointer?;
  • plantage ou erreur lors d'un appel ? new ou ? delete DAMAGE : After Normal Block (#47), Heap block 3228a8 modified, Invalid Address specified to RtlFreeHeap?;
  • variables qui changent de valeur sans qu'on y ait touch鬆;
  • erreur lors d'une affectation, d'un passage de param鑼res, d'une copie?;
  • contenu inattendu dans des tableaux?;

Ces dysfonctionnements ont plusieurs causes possibles, mais ils sont g駭駻alement li駸 ? une mauvaise utilisation de la m駑oire. La premi鑽e chose ? faire est de compiler votre programme avec les options de d饕ogage activ馥s et de l'ex馗uter dans un d饕ogueur afin que ce dernier vous emm鈩e pr馗is駑ent ? l'endroit o? l'erreur est d騁ect馥 (ce qui ne veut pas dire que c'est l? qu'elle a lieu !).
Dans le cas d'un pointeur nul o? d'une violation d'acc鑚, il peut s'agir une erreur simple de programmation telle qu'un pointeur non initialis?.
Si vous 黎es confront? ? une erreur d'apparence plus surnaturelle, v駻ifiez les points suivants :
  • les constructeurs par recopie de vos objets qui allouent des ressources?;
  • qu'il n'y a pas de d饕ordement m駑oire quelque part, en particulier ? proximit? de l'objet victimes de comportements 騁ranges?;
  • que vos pointeurs sont correctement initialis駸, et qu'ils ne pointent pas vers des donn馥s qui ont 騁? lib駻馥s / d騁ruites par la suite.

Soyez s?rs d'une chose : une variable ne change pas toute seule sans raisons de valeur. Cela est tr鑚 souvent d? ? un d饕ordement qui vient 馗raser le contenu de votre variable. V駻ifiez donc minutieusement l'utilisation que vous faites des pointeurs.
Un autre cas fr駲uent d'erreur est d馗lench? par les op駻ateurs et fonctions de gestion de la m駑oire new, delete, malloc(), free(). Il faut savoir que ces derniers, en particulier en mode d饕ogage, effectuent divers tests pour d騁ecter toute mauvaise utilisation ou corruption de la m駑oire. Si la v駻ification 馗houe, alors une erreur est signal馥. Ce n'est donc pas ces op駻ateurs / fonctions qui sont en cause, mais bien votre code qui les utilise de mani鑽e erron馥. En particulier, v駻ifiez bien que :
  • vous utilisez delete [] non pas delete pour lib駻er des tableaux allou駸 avec new []
  • vous utilisez delete pour lib駻er une allocation faite avec new, et free() pour malloc() ne pas m駘anger les deux !)
  • que vous n'avez pas d駸allou? une ressource deux fois
  • que le pointeur retourn? par new n'a pas 騁? modifi? ou alt駻? avant son passage ? delete

Le message d'erreur vous aide g駭駻alement ? d馗eler le probl鑪e. Si ce dernier parle de bloc corrompu ou modifi?, alors il s'agit d'un d饕ordement m駑oire qui a 馗ras? les donn馥s internes ajout馥s ? proximit? de votre allocation par la biblioth鑷ue standard (afin de garder une trace de ce qui a 騁? allou?, de faire des v駻ification, etc.).

Mis ? jour le 18 avril 2005 Aurelien.Regat-Barrel

Sous Windows, quand on lance un programme console depuis certains IDE (tel que Dev C++), sa console n'est visible que durant son ex馗ution. Si ce dernier ne fait qu'afficher un message, elle va donc dispara?tre imm馘iatement sans que l'on puisse lire quoique ce soit. Une solution simple consiste donc ? attendre que l'utilisateur appuie sur la touche entr馥 avant de se terminer, comme dans l'exemple suivant :

Code c++ : S駘ectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>  
#include <limits>  
 
using namespace std; 
 
int main() 
{ 
 cout << "Hello World !\n"; 
 
 // attendre avant de quitter 
 cin.ignore( numeric_limits<streamsize>::max(), '\n' ); 
}
La m騁hode utilis馥 pour effectuer cette attente est d騁aill馥 dans Comment faire une pause (attendre que l'utilisateur tape une touche) ?.

Mis ? jour le 18 avril 2005 Aurelien.Regat-Barrel

La raison la plus probable est l'absence de la directive using namespace std;. Cette directive 騁ait optionnelle avec gcc 2.x (ceci 騁ait un d馭aut de conformit? au standard). Il faut maintenant, avec gcc 3.x qui est conforme au standard, la mettre dans chaque fichier source, apr鑚 le bloc des #include. Le programme ainsi modifi? compilera aussi bien avec gcc 2.x que gcc 3.x.

Mis ? jour le 9 octobre 2003 Anomaly

En ajoutant un fichier lib ? la ligne de commande avec devcpp vous aurez l'erreur suivante :

file not recognized C:\Dev-Cpp\lib\glut32.lib File format not recognized
Cela est d? au fait que le port de gcc fourni avec devcpp (MingW) utilise son propre type de fichiers lib portant l'extension .a. Il vous faut donc obtenir une version compatible avec devcpp de la biblioth鑷ue que vous voulez utiliser.
Notez qu'un grand nombre d'entre-elles sont fournies dans le r駱ertoire \lib, comme cela est le cas dans cet exemple avec libglut32.a. Regardez donc dans ce r駱ertoire pour voir si l'駲uivalent de votre .lib ne s'y trouve pas.

Mis ? jour le 22 novembre 2004 Aurelien.Regat-Barrel

Si en compilant un programme C/C++ sous Windows vous obtenez un message d'erreur du type

error LNK2019: symbole externe non r駸olu _WinMain@16 r馭駻enc? dans la fonction _WinMainCRTStartup
[Linker error] undefined reference to `WinMain@16'
C'est que vous avez cr鳬 un projet Win32 sans console au lieu d'un projet console, ce qui fait que le compilateur s'attend ? trouver la fonction d'entr馥 WinMain() ? la place de la fonction standard main(). タ partir de Visual C++ 7, vous pouvez modifier les propri騁駸 de votre projet via Propri騁駸 de configuation->Editeur de liens->Syst鑪e->Sous-syst鑪e : Console (/SUBSYSTEM:CONSOLE). Pour les versions ant駻ieures, il faut cr馥r un nouveau projet console.

Mis ? jour le 22 novembre 2004 Aurelien.Regat-Barrel

L'impl駑entation de la STL livr馥 avec Visual C++ 6 poss鐡e divers bugs. Il est vivement conseill? de proc馘er ? sa mise ? jour ? partir du site de Dinkumware qui est l'auteur de cette impl駑entation. Pour cela, lire la page Fixes for Library Bugs in VC++ V5.0/V6.0>.

Mis ? jour le 22 novembre 2004 Aurelien.Regat-Barrel

Fatal error C1010: unexpected end of file while looking for precompiled header directive
Fatal error C1010: Fin de fichier inattendue lors de la recherche d'une directive d'en-t黎e pr馗ompil?
Cette erreur survient quand votre projet est configur? pour utiliser un fichier d'en-t黎e pr馗ompil? (typiquement stdafx.h). Il vous suffit de d駸activer l'utilisation des en-t黎es pr馗ompil馥s dans les options C/C++ de votre projet.

Mis ? jour le 18 avril 2005 Aurelien.Regat-Barrel

Vous trouverez des solutions ? divers probl鑪es sp馗ifiques ? Visual C++ dans la FAQ Visual C++.

Mis ? jour le 18 avril 2005 Aurelien.Regat-Barrel

Pas de panique, il se peut que ce soit normal. Si vous utilisez un outil de d騁ection de fuites m駑oires (par exemple valgrind) sur ce programme, avec certains compilateurs (par exemple gcc) vous verrez un rapport indiquant de la m駑oire non lib駻馥 :

Code c++ : S駘ectionner tout
1
2
3
4
5
6
7
8
9
10
11
#include <string> 
#include <iostream> 
 
using namespace std; 
 
int main() 
{ 
 string s("hello world"); 
 cout << s << endl; 
 return EXIT_SUCCESS; 
}
1
2
3
4
5
LEAK SUMMARY: 
 definitely lost : 0 bytes in 0 blocks. 
 possibly lost : 0 bytes in 0 blocks. 
 still reachable: 960 bytes in 1 blocks. 
 suppressed: 0 bytes in 0 blocks.
Il ne s'agit pourtant pas de fuite m駑oire mais d'une fonctionnalit? de la biblioth鑷ue standard. En effet, celle-ci peut poss馘er son propre espace d'allocation afin d'optimiser les performances, celui-ci n'騁ant pas lib駻? et rendu ? l'OS une fois votre programme termin?. Mais pas de panique, la quantit? de m駑oire non lib駻馥 est constante et ne grossira jamais, peu importe le nombre d'objets que votre programme manipulera.

Toutefois, si cette fonctionnalit? vous g麩e vraiment vous pouvez la d駸activer et forcer l'allocation ォ classique サ :
  • En d馭inissant la macro __USE_MALLOC (gcc versions 2.91, 2.95, 3.0 et 3.1)
  • En d馭inissant la variable d'environnement GLIBCPP_FORCE_NEW (gcc versions 3.2.2 et sup駻ieures)
  • Si avez le go?t du risque, vous pouvez 馮alement r鳬crire vos propres allocateurs

Cependant n'oubliez pas que ce comportement est un cas isol?, et que 99 % des fuites m駑oires seront dues ? des erreurs de votre part. Avant d'incriminer la biblioth鑷ue standard, pensez ? faire un maximum de tests !

Mis ? jour le 17 octobre 2005 Laurent Gomila

Proposer une nouvelle r駱onse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plut?t sur le forum de la rubrique pour 軋


R駱onse ? la question

Liens sous la question

Les sources pr駸ent馥s sur cette page sont libres de droits et vous pouvez les utiliser ? votre convenance. Par contre, la page de pr駸entation constitue une 忖vre intellectuelle prot馮馥 par les droits d'auteur. Copyright ゥ 2026 Developpez Developpez LLC. Tous droits r駸erv駸 Developpez LLC. Aucune reproduction, m麥e partielle, ne peut 黎re faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'? trois ans de prison et jusqu'? 300 000 ? de dommages et int駻黎s.

AltStyle によって変換されたページ (->オリジナル) /