У меня есть список в 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;
}