Frage

Ich habe eine Liste in C, die so etwas wie dies:

typedef struct _node
{
   int number;
   DWORD threadID;
   HANDLE threadH;
   struct *_node next;
} *node;

Und Sie haben ungefähr wie folgt aus:

node new_node = malloc(sizeof(node));

Wie Sie aus erraten haben, wird diese Liste speichern Informationen für Threads, einschließlich ihrer Handler und IDs. Noch habe ich Probleme, wenn ich versuche, dies zu tun:

free(new_node);

Jedesmal, wenn ich versuche, dies zu tun, ich einen unerwarteten Fehler auftreten, VS sagte, dass es eine Datenkorruption ist. Ich habe so viel wie möglich festgenagelt, und ich fand, dass das Problem darin, wenn ich versuche frei, den Griff zu verwenden. Ich habe auf MSDN gesucht, wie dies zu tun, aber das einzige, was ich finden kann, ist die Funktion, den Faden schließt (die hier nicht vorgesehen ist, da ich den Thread ausgeführt werden soll, nur um es den Datensatz aus der Liste zu löschen).

Die Frage ist: Wie soll ich einen Griff aus dem Speicher befreien? (Bedenkt man, dass dies nur eine Kopie des Wertes des Griffs ist, wird der aktive Handle nicht gelöscht werden).

EDIT: Dies ist die Funktion Knoten aus der Liste einzufügen:

int insereVisitanteLista(node* lista, DWORD threadID, HANDLE threadH, int num_visitante)
{
    node visitanteAnterior;
    node novoVisitante = (node)malloc(sizeof(node));

    if(novoVisitante == NULL)
        return 0;

    novoVisitante->threadID = threadID;
    novoVisitante->threadH = threadH;
    novoVisitante->number = num_visitante;
    novoVisitante->next = NULL;

    if(*lista == NULL)
    {
        *lista = novoVisitante;
        return 1;
    }

    visitanteAnterior = *lista;

    while(visitanteAnterior->next != NULL)
        visitanteAnterior = visitanteAnterior->next;

    visitanteAnterior->next =novoVisitante;
    return 1;
}

Und das ist die Funktion zu löschen Knoten:

int removeVisitanteLista(node * lista, DWORD threadID)
{
    node visitanteAnterior = NULL, visitanteActual;

    if(*lista == NULL)
        return 0;

    visitanteActual = *lista;

    if((*lista)->threadID == threadID)
    {
        *lista = visitanteActual->next;
        visitanteActual->next = NULL;
        free(visitanteActual);

        return 1;
    }

    while(visitanteActual != NULL && visitanteActual->threadID != threadID)
    {
        visitanteAnterior = visitanteActual;
        visitanteActual = visitanteActual->next;
    }

    if (visitanteActual == NULL)
        return 0;

    visitanteAnterior->next = visitanteActual->next;
    free(visitanteActual);

    return 1;
}
War es hilfreich?

Lösung

Was genau ist ein node, dass Sie zu befreien versuchen? Ist dies ein Zeiger auf eine Struktur _node? Wenn ja, haben Sie es vorher zugewiesen? Wenn nein, free nicht benötigt wird, sonst muss man überprüfen, ob Knoten nicht NULL ist und stellen Sie sicher, Sie free es nicht mehrfach. Es ist schwer zu erraten, was Sie tun und wo ist ein Fehler ohne minimales Arbeits Beispiel reproduziert das Problem. Das einzige, was ich vorschlagen kann, ist über die Speicherverwaltung in C Diese Ressource könnte helfen lesen .

UPDATE:

Knoten in Ihrem Code ist ein Zeiger auf _node. So sizeof (Knoten) eine Größe eines Zeigers, die entweder 4 oder 8 Byte (abhängig von der Architektur). So Sie 8 Bytes zuweisen, zum Beispiel, aber davon ausgehen, haben Sie einen Zeiger auf die Struktur, die viel größer ist. Als Ergebnis Sie korruptes Gedächtnis und Verhalten des Programms wird nicht definiert. So ändert Knoten novoVisitante = (Knoten) malloc (sizeof (Knoten)) an den Knoten novoVisitante = (Knoten) malloc (sizeof (_node)) sollte das Problem beheben.

Andere Tipps

Sie haben uns den Kontext auf Ihrem Anruf frei gezeigt (), damit ich brauche ein wenig zu spekulieren, aber meine erste Sorge ist, dass Sie nicht den Knoten aus der Liste zu entfernen erwähnen, bevor sie gelöscht werden.

Start durch den Knoten Entkoppeln durch das nächste Feld des vorangegangenen (oder Kopf) Knoten zu modifizieren. Wenn Sie weiterhin die Fehlermeldung erhalten, dann haben Sie beschädigte Speicher irgendwie durch ähnliche hinter dem Ende eines Ihrer zugewiesenen Speicherstrukturen oder etwas zu schreiben.

Auch gehe ich davon aus Knoten ist ein Zeiger. Sie haben wirklich nicht viele Informationen über das, was Sie tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top