Question

Je sais que c'est vraiment général, mais j'obtiens « ceci » (voir ci-dessous) lorsque j'exécute mon fichier .c dans Visual C++ 2008 Express.Ça arrive quand j'appelle malloc ().Prenez mon travail là-dessus - j'alloue dynamiquement la mémoire correctement.

TAS[Code.exe] :TAS:Bloc de tas gratuit 211a10 modifié à 211af8 après sa libération Windows a déclenché un point d’arrêt dans Code.exe.

Cela peut être dû à une corruption du tas, ce qui indique un bogue dans Code.exe ou dans l'une des DLL qu'il a chargées.

Cela peut également être dû au fait que l'utilisateur appuie sur F12 alors que Code.exe a le focus.

La fenêtre de sortie peut contenir davantage d'informations de diagnostic.

Pourquoi est-ce que j'obtiens cette erreur ?Qu’est-ce que cela signifie ?

Était-ce utile?

La solution

Le message d'erreur vous indique exactement pourquoi vous l'avez:

  

Bloc libre Heap 211a10 modifié à 211af8 après avoir été libéré

Vous avez eu un bloc alloué tas qui a été libéré alors quelque chose écrit à cette zone de mémoire. Ce n'est pas agréable d'écrire sur un bloc libéré de la mémoire.

Autres conseils

L'erreur est pas réellement passe lorsque vous appelez malloc; c'est juste quand il déclenche une analyse de tas libre. L'erreur réelle est arrivé quelque part. Vous malloced une mémoire à l'adresse 211a10 (c'est ce que malloc retourné). Ensuite, vous (ou un autre lib) libéra. Puis, plus tard, lorsque vous appelez malloc en mode débogage, il scanne tout le tas - par courtoisie pour vous, le pauvre programmeur. Il découvre que quelqu'un (votre ou quelque lib que vous appelez) écrit sur une partie de ce tableau, plus précisément à l'adresse 211af8 ou octets de 0xe8 dans le tableau. Donc, vous êtes soit toujours accroché à un pointeur qui a été libéré (le plus probable) et l'utiliser, ou vous êtes juste bousiller la mémoire aléatoire.

Dans mon cas, avec des symptômes similaires, la question était la non-concordance d'alignement struct (option / ZP)

Je définis mon code d'un alignement de struct différent de bibliothèques externes (wxWidgets). Cependant, wxWidgets a été construit avec le makefile, il a été compilé en utilisant le défaut / Zp. Et wxWidget est lié statiquement.

Vous pouvez le faire, mais si vous essayez de supprimer un objet de classe wxWidgets de votre code le compilateur devient confus au sujet de la taille exacte des membres struct. Et lors de l'exécution, vous obtenez ce message:

HEAP[Code.exe]: HEAP: Free Heap block 211a10 modified at 211af8 after it was freed 
Windows has triggered a breakpoint in Code.exe.

Solution:

  • Assurez-vous d'utiliser le même "struct Membre d'alignement" dans tout le code et les bibliothèques.

  • meilleure règle est de définir / ZP d'utiliser la valeur « par défaut ». Dans Visual Studio, sous Propriétés code C / C ++ génération

  • MSDN cite: " Vous ne devriez pas utiliser cette option que si vous avez des exigences spécifiques d'alignement ." Voir

  • Astuce: utiliser #pragma pack si vous avez besoin de contrôler l'alignement dans certains struct Voir il y a

Exemple:

#pragma pack(1) // - 1 byte alignment 

    typedef union 
    {   
        u64 i;
        struct{             // CUSTOMS.s is used by Folders
            u32  uidx;      // Id, as registered 
            byte isoS, isoT;    // isoS/isoT combination.
            byte udd0, udd1;    // custom values (TBD)
        }s;
    }CUSTOMS;

    struct Header   // exactly 128 bits
    {       
        u32 version;        
        u32 stamp;          // creation time
        CUSTOMS customs;                // properties 
    }

#pragma pack()  // this pragma restores the **default** alignment

*

Hope cette explication aide, parce que ce n'est pas vraiment un bug dans le code, mais une erreur de configuration grave: difficile à détecter, car il est situé dans les options subtiles du compilateur. Merci pour tous,

    *
  

J'alloue dynamiquement la mémoire correctement.

Je pense que le problème ici est que vous désallouer la mémoire mal découpé. Ce que je veux dire par là que, vous pouvez essayer d'utiliser la mémoire libérée. Désolé, je ne peux plus loin, vous pouvez probablement ajouter le code réel.

  

Prenez mon travail à ce sujet -. J'allouer dynamiquement la mémoire correctement

Mais vous que vos tampons sont tous de la bonne taille et que vous les free() correctement? Double Frees et les dépassements de tampon peut facilement conduire à la corruption tas qui peut causer malloc() échouer dans toutes sortes de façons.

Si les structures de gestion utilisées en interne par malloc() endommagés, il ne sera généralement pas conduire à une erreur immédiatement. Mais les appels plus tard malloc() ou free() qui tentent d'utiliser ces structures endommagées échouera faire des choses erratiques.

Utilisez-vous malloc() sur un tableau ?Parce que je pense l'erreur vient peut-être du fait que vous oubliez d'attribuer un emplacement mémoire supplémentaire à la fin -- ce qui se passe, c'est qu'il essaie d'écrire à cet emplacement, qui ne lui est pas alloué, et suppose qu'il essaie d'écrire à un emplacement qui a déjà été libéré.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top