从链表中释放节点(内存方面)
Freeing Node from LinkedList ( memory wise )
当将列表的头部发送到 free()
内存的函数时。编译器给出的错误是:
"HEAD CORRUPTION DETECTED: after Normal block (#70) at 0x011BCC0
CRT detected that the application wrote to memory after end of head buffer. "
我试图 free()
只有第一个节点只是为了看看它是怎么回事,但它同样的错误。
接收链表本身的函数:
void freeListOfEmployees(EmployeeNode *head)
{
EmployeeNode *ptr = head, *temp = NULL;
while (ptr != NULL) {
temp = ptr;
ptr = ptr->next;
free(temp);
}
head = NULL;
}
问题不在 freeListOfEmployees
而在 createEmployeeNode
,更具体地说在这一行:
EmployeeNode *temp = (EmployeeNode *)malloc(sizeof(EmployeeData));
^^^^^^ ^^^^^^
您正在为 EmployeeNode
分配内存,但您要求 EmployeeData
的大小。
这是正确的:
EmployeeNode *temp = (EmployeeNode *)malloc(sizeof(EmployeeNode));
或更好:
EmployeeNode *temp = (EmployeeNode *)malloc(sizeof *temp);
甚至更好:
EmployeeNode *temp = malloc(sizeof *temp);
这样就不可能弄错尺码了。
而且演员表 (EmployeeNode*)
并非完全错误,但毫无用处。
期待您的下一个问题:为什么问题只出现在 freeListOfEmployees
而不是之前?
回答:因为你覆盖了不属于你的内存,触发了所谓的"undefined behaviour",一旦未定义的行为被触发,任何事情都可能发生。未定义的行为包括 "apparently woring fine".
当将列表的头部发送到 free()
内存的函数时。编译器给出的错误是:
"HEAD CORRUPTION DETECTED: after Normal block (#70) at 0x011BCC0
CRT detected that the application wrote to memory after end of head buffer. "
我试图 free()
只有第一个节点只是为了看看它是怎么回事,但它同样的错误。
接收链表本身的函数:
void freeListOfEmployees(EmployeeNode *head)
{
EmployeeNode *ptr = head, *temp = NULL;
while (ptr != NULL) {
temp = ptr;
ptr = ptr->next;
free(temp);
}
head = NULL;
}
问题不在 freeListOfEmployees
而在 createEmployeeNode
,更具体地说在这一行:
EmployeeNode *temp = (EmployeeNode *)malloc(sizeof(EmployeeData));
^^^^^^ ^^^^^^
您正在为 EmployeeNode
分配内存,但您要求 EmployeeData
的大小。
这是正确的:
EmployeeNode *temp = (EmployeeNode *)malloc(sizeof(EmployeeNode));
或更好:
EmployeeNode *temp = (EmployeeNode *)malloc(sizeof *temp);
甚至更好:
EmployeeNode *temp = malloc(sizeof *temp);
这样就不可能弄错尺码了。
而且演员表 (EmployeeNode*)
并非完全错误,但毫无用处。
期待您的下一个问题:为什么问题只出现在 freeListOfEmployees
而不是之前?
回答:因为你覆盖了不属于你的内存,触发了所谓的"undefined behaviour",一旦未定义的行为被触发,任何事情都可能发生。未定义的行为包括 "apparently woring fine".