LinkedList-如何释放内存

时间:2019-05-13 07:54:17

标签: c singly-linked-list memory-corruption

当我将列表的开头传递给free()内存的函数时。我得到的错误如下:

"HEAD CORRUPTION DETECTED: after Normal block (#70) at 0x011BCC0
CRT detected that the application wrote to memory after end of head buffer. "

我尝试仅free()仅查看第一个节点,以了解其运行方式,但存在相同的错误。
我还尝试在main中使用free(),而不是将head传递给函数,但是我必须在函数中执行。

void freeListOfEmployees(EmployeeNode *head)
{
    EmployeeNode *ptr = head, *temp = NULL;

    while (ptr != NULL) { 
        temp = ptr; 
        ptr = ptr->next; 
        free(temp); 
    }

    head = NULL;
}

1 个答案:

答案 0 :(得分:1)

问题不在import numpy as np from scipy.stats import norm n = 10000 observations = np.random.uniform(low=5, high=7, size=n) groups = np.random.randint(low=1, high=10, size=n) data = np.array([groups, observations]).T df = np.array([norm.fit(data[data[:,0]==i,1]) for i in np.unique(data[:,0])]) mu = df[:, 0] std = df[:, 1] print(mu, std) # [6.00968012 5.97677677 5.99516999 5.99329037 6.01787526 5.98163756 6.01775866 6.01331319 5.97938708] # [0.57232071 0.57108535 0.57457272 0.569295 0.57263456 0.58611009 0.57446768 0.58279465 0.5719683 ] 中,而在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*)而不是之前发生?

答案:因为您正在覆盖不属于您的内存,从而触发了所谓的“未定义的行为”,一旦触发了未定义的行为,任何事情都会发生。未定义的行为包括“显然要罚款”。