Как использовать бесплатно на дескриптор внутри списка? -> C -> Windows API - PullRequest
1 голос
/ 23 декабря 2010

У меня есть список в C, который выглядит примерно так:

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

И у вас есть что-то вроде этого:

node new_node = malloc(sizeof(node));

Как вы уже догадались, этот список будет хранить информацию для потоков, включая их обработчики и идентификаторы. Тем не менее у меня возникают проблемы, когда я пытаюсь сделать это:

free(new_node);

Каждый раз, когда я пытаюсь сделать это, я сталкиваюсь с неожиданной ошибкой, VS говорит, что произошло повреждение данных. Я зафиксировал как можно больше и обнаружил, что проблема заключается в том, что я пытаюсь использовать свободную ручку. Я искал в MSDN, как это сделать, но единственное, что я могу найти, - это функция, которая закрывает поток (который здесь не предназначен, так как я хочу, чтобы поток запускался, просто удаляя его запись из списка).

Вопрос в том, как мне освободить ручку из памяти? (Учитывая, что это только копия значения дескриптора, активный дескриптор не удаляется).

РЕДАКТИРОВАТЬ: Это функция для вставки узлов из списка:

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;
}

А это функция для удаления узлов:

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;
}

Ответы [ 2 ]

0 голосов
/ 23 декабря 2010

Вы не показали нам контекст вашего вызова free (), поэтому мне нужно немного поразмышлять, но моя первая проблема в том, что вы не упомянули об удалении узла из списка до его удаления.

Начните с отсоединения узла, изменив следующее поле предыдущего (или головного) узла. Если вы по-прежнему получаете сообщение об ошибке, значит, вы каким-то образом повредили память, записав за конец одну из выделенных структур памяти или что-то подобное.

Кроме того, я предполагаю, что узел является указателем. Вы действительно не предоставили много информации о том, что вы делаете.

0 голосов
/ 23 декабря 2010

Что такое node, который вы пытаетесь освободить?Это указатель на структуру _node?Если да, вы выделили это ранее?Если нет, free не требуется, в противном случае вы должны проверить, не является ли узел NULL, и убедиться, что вы не free это несколько раз.Трудно догадаться, что вы делаете и где ошибка, без минимального рабочего примера, воспроизводящего проблему.Единственное, что я могу предложить, это прочитать об управлении памятью в C. Этот ресурс может помочь.

UPDATE:

узел в вашем коде - это указатель на _node.Таким образом, sizeof (узел) - это размер указателя, который составляет 4 или 8 байтов (в зависимости от архитектуры).Так, например, вы выделяете 8 байтов, но предполагаете, что у вас есть указатель на структуру, которая намного больше.В результате вы повреждаете память, и поведение программы становится неопределенным.Таким образом, замена узла novoVisitante = (узел) malloc (sizeof (узел)) на узел novoVisitante = (узел) malloc (sizeof (_node)) должна решить проблему.

...