Domanda

Ho un semplice programma C che ha un puntatore a un array di caratteri. Per iniziare, lo uso malloc, e ridimensionare quindi impostarlo x numero di volte in seguito nel programma.

Quando ho ridimensionare una volta con realloc, gdb non mostra eventuali errori, tuttavia, se tento di chiamare di nuovo la funzione di ridimensionamento, gdb mostra il seguente errore:

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

Tutte le idee perché il ridimensionamento più di una volta dà questo errore?

Modifica

ho giocato intorno con esso e sembra l'errore non si verifica quando io commento l'impostazione dei dati puntatore, che è dopo il ridimensionamento.

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;
}
È stato utile?

Soluzione

class->name = name non sta facendo quello che si pensa che è. Utilizzare strncpy() per copiare la stringa di input nella vostra memoria appena allocata. Questo incarico che hai lì perde la memoria allocata e sovrascrivendo il puntatore. Quindi la prossima volta che si chiama setName(), si finisce per chiamare realloc() con un puntatore che non ha ottenuto da malloc(). Mi aspetto da qualche parte che si sta chiamando setName() con una costante, variabile globale, o una stringa variabile locale, ed è quello che alla fine genera l'errore. Se tu fossi sempre e solo chiamando setName() con le stringhe il cui ricordo che hai da malloc(), non vedrebbe l'avvertimento da gdb (ma saresti ancora avere il bug!).

Altri suggerimenti

eseguirlo sotto valgrind o recinto elettrico - questi saranno posto il superamento di memoria per voi

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top