CORRECTIF : Libération de plusieurs fois la mémoire peut provoquer une erreur d'application dans Visual C++

IMPORTANT : Cet article est issu d'une traduction automatique réalisée par un logiciel Microsoft et non par un traducteur professionnel. Cette traduction automatique a pu aussi être révisée par la communauté Microsoft grâce à la technologie Community Translation Framework (CTF). Pour en savoir plus sur cette technologie, veuillez consulter la page http://support.microsoft.com/gp/machine-translation-corrections/fr. Microsoft vous propose en effet des articles traduits par des professionnels, des articles issus de traductions automatiques et des articles issus de traductions automatiques révisées par la communauté Microsoft, de manière à ce que vous ayez accès à tous les articles de notre Base de connaissances dans votre langue. Il est important de noter que les articles issus de la traduction automatique, y compris ceux révisés par la communauté Microsoft, peuvent contenir des erreurs de vocabulaire, de syntaxe ou de grammaire. Microsoft ne pourra être tenu responsable des imprécisions, erreurs, ainsi que de tout dommage résultant d’une traduction incorrecte du contenu ou de son utilisation par les clients.

La version anglaise de cet article est la suivante: 194550
Symptômes
Un espace mémoire qui a été libéré plusieurs fois peut causer une erreur d'application.

Remarque: Ceci est vrai si vous utilisez malloc et plusieurs "free" ou si vous utilisez "new" et plusieurs "delete"
Cause
Le tas est modifié après le premier appel à "free()" et est alors dans un état dans lequel les appels ultérieurs à "free()" ne fonctionneront pas.
Résolution
Éviter d'appeler plusieurs "free" ou plusieurs "delete" sur le même pointeur. Une façon d'éviter ce problème est d'assigner le pointeur à null après l'appel à "free" ou "delete". Les fonctions "delete" et "free" s'exécutent sans rien faire si un pointeur à null est passé comme argument. Cela ne fonctionne pas dans les cas où "free" ou "delete" est appelé sur plusieurs pointeurs pointant vers le même emplacement de mémoire.

Pour aider les clients qui rencontrent ce problème dans leurs applications tierces, Microsoft a publié une nouvelle C-Run-time Library DLL, Msvcrt.dll, qui implémente deux gestionnaires de tas, le Gestionnaire de tas compatible Visual C++ 5 et le Gestionnaire de tas compatible Visual C++ 6. Il détecte avec quelle version de Visual C++ votre application est créée et utilise le Gestionnaire de tas approprié pour cette application. Si cette version est la 6.0 ou une version ultérieure, le Gestionnaire de tas compatible Visual C++ 6 est utilisé, et si elle est antérieure à la version 6.0, le Gestionnaire de tas compatible Visual C++ 5 est utilisé.

Les utilisateurs de Visual Studio 6.0 peuvent obtenir cette nouvelle msvcrt.dll en installant le dernier Service Pack Microsoft Visual Studio. Les utilisateurs qui n'utilisent pas Visual Studio doivent installer la mise à jour des bibliothèques Microsoft.
Statut
Microsoft a confirmé qu'il s'agit d'un bogue dans les produits Microsoft répertoriés au début de cet article.
Ce bogue a été corrigé dans Visual Studio 6.0 Service Pack 3. Pour plus d'informations sur les service packs de Visual Studio, consultez les articles suivants dans la Base de connaissances Microsoft :

194022 Visual Studio 6.0 service packs, quoi, où, pourquoi

194295 Comment savoir si un service pack Visual Studio est installé
Plus d'informations
Libérer de la mémoire plusieurs fois produit un comportement non défini.

La version Release de l'exemple de code ci-dessous cause une erreur d'application lors de la génération avec Visual C++ 6.0 ; le code ne provoque pas une erreur d'application lors de la génération avec Visual C++ 5.0.

Les versions Debug avec Visual C++ 6.0 ou Visual C++ 5.0 génèrent une assertion :
   Debug Assertion Failed!				

Il est important de noter que l'état du Small Block Heap (SBH) est en permanence fluctuant. De ce fait, il existe des situations où il est possible qu'aucune assertion n'est délivrée dans la version debug, mais une erreur d'application se produit dans la version Release.

Les versions Release dans Visual C++ 6.0 sont plus sensibles au fait de libérer de la mémoire à plusieurs reprises que dans Visual C++ 5.0. Avec Visual C++ 5.0, le cas ci-dessous est un exemple où l'appel incorrect à "free" est inoffensif. Si l'appel à free() avait été effectué plus tard que dans l'original, il aurait été possible de provoquer une erreur d'application. Il est fort probable que la mémoire sera endommagée.

Exemples de code

   // Compile options for Release builds /c   // Compile options for Debug builds /c /Zi   #include <malloc.h>   int main(int argc, char* argv[])   {      char *pChar1 = (char *)malloc(10*sizeof(char));      char *pChar2 = (char *)malloc(10*sizeof(char));      free(pChar1);      free(pChar1);      return 0;   }				
kbVS600sp2 de Msvcrt.dll

Avertissement : Cet article a été traduit automatiquement.

Propriétés

ID d'article : 194550 - Dernière mise à jour : 07/12/2015 02:19:00 - Révision : 4.0

  • kberrmsg kbqfe kbbug kbcode kbcrt kbfix kbvs600sp2fix kbvs600sp3fix kbmt KB194550 KbMtfr
Commentaires