【发布时间】:2010-12-23 18:53:08
【问题描述】:
我在 C 中有一个类似这样的列表:
typedef struct _node
{
int number;
DWORD threadID;
HANDLE threadH;
struct *_node next;
} *node;
你有这样的东西:
node new_node = malloc(sizeof(node));
您可能已经猜到了,这个列表将存储线程的信息,包括它们的处理程序和 Id。当我尝试这样做时仍然遇到问题:
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;
}
【问题讨论】:
-
列表插入/删除代码看起来不错...
-
我也这么认为....不知道为什么手柄让我这么打架。试图将句柄的指针转换为 void*,没有骰子,将句柄 1st 设置为 null,也没有骰子....我真的没有得到这个......而且插入总是很好,移除永远不会跨度>
标签: c windows memory-management handle memory-corruption