Question

J'ai un programme simple C qui a un pointeur sur un tableau de caractères. Pour le lancer, j'utilise malloc, et redimensionnez puis réglez-x nombre de fois plus tard dans le programme.

Quand je redimensionner une fois avec realloc, gdb ne montre pas si je cependant des erreurs, essayez d'appeler la fonction de modification de taille à nouveau, gdb affiche l'erreur suivante:

warning: Invalid Address specified to RtlReAllocateHeap( 003E0000, 00404076 )

Toutes les idées pourquoi le redimensionnement plus que donne une fois cette erreur?

EDIT

J'ai joué avec elle et il semble l'erreur ne se produit pas lorsque je commente le cadre des données de pointeur, ce qui est après le redimensionnement.

void setName(struct class_x *class, char *name)
{
    class->name = (char *) reallocateMemory(class->name, sizeof(char) * strlen(name) + 1);
    class->name = name;
}

void *reallocateMemory(void *member, size_t size)
{
    void *tmp = realloc(member, size);
    if(tmp == NULL)
    {
        //handle
    }
    return tmp;
}
Était-ce utile?

La solution

class->name = name ne fait pas ce que vous pensez qu'il est. Utilisez strncpy() pour copier la chaîne d'entrée dans votre mémoire nouvellement allouée. Cette mission que vous avez là fuit votre mémoire allouée et écrasez le pointeur. Alors la prochaine fois que vous appelez setName(), vous finissez par appeler realloc() avec un pointeur que vous n'avez pas reçu de malloc(). Je me attends quelque part que vous appelez setName() avec une variable globale constante, ou une chaîne variable locale, et c'est ce qui générait l'erreur. Si vous ne jamais appelez setName() avec des chaînes dont la mémoire vous avez de malloc(), vous ne voyez pas l'avertissement de gdb (mais vous auriez toujours le bug!).

Autres conseils

exécuter sous valgrind ou clôture électrique - ceux-ci repérer les dépassements de mémoire pour vous

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