정렬 된 연결 목록에 데이터 (ints)를 삽입하는 교수님이 제공 한 함수를 사용했습니다.
void sorted_insert(int x,node_t **list)
{
node_t *q = NULL, *pq = NULL, *new_node = NULL;
q = *list;
while (q && x > q->data)
{
pq = q;
q = q->next;
}
new_node = malloc(sizeof(node_t));
new_node->data = x;
new_node->next = q;
if (!pq) { *list = new_node; }
else { pq->next = new_node; }
}
주요 통화 :
node_t *list = NULL
sorted_insert(x,&list);
100 개의 임의의 정수를에 저장하여 테스트했으며 숫자가 정렬됨에 따라 예상되는 작업을 수행하고 있습니다. 나중에 사용자 지정 무료 함수를 사용하여 각 노드를 해제했습니다.
void free_list(node_t *list)
{
node_t *tmp = NULL;
for (; list; list = list->next)
{
tmp = list;
free(tmp);
}
return;
}
내가 가진 프로그램을 분석 할 때, Valgrind의를 , 내가 기능 sorted_insert 메모리를 누출하고,이 라인에 정확하게 것을 보여주고있다 :new_node = malloc(sizeof(node_t));
Valgrind 출력 :
==9478== 160 (16 direct, 144 indirect) bytes in 1 blocks are definitely lost in loss record 2 of 2
==9478== at 0x483C7F3: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==9478== by 0x109270: sorted_insert (list_insert_sorted.c:23)
==9478== by 0x10938D: main (list_insert_sorted.c:55)
왜 이런 일이 발생합니까? 무료 기능에 문제가 있습니까? 미리 감사드립니다.
편집 : 나는 for 루프를 변경했으며 노드를 건너 뛰지 않고 여전히 메모리가 누출됩니다.
자유 반복자는 노드를 건너 뛰고 루프 본문에는 list=list->next
, 반복자도 있으므로 두 번 발생합니다. 당신이 홀수를 가지고 있었다면 NULL 포인터를 역 참조하는 것을 피하면서 짝수의 노드를 가졌다는 것은 행운입니다.
void free_list(node_t *list)
{
node_t *tmp = list;
while(tmp)
{
list = list->next;
free(tmp);
tmp = list;
}
return;
}
그런 다음 코드를 편집하여 중복 반복기를 제거했지만 편집 된 코드에서, 이후 free(tmp)
에 메모리 list
포인트가 더 이상 유효하지 않으며 ( tmp
결국 동일한 주소 ) 편집 된 코드 list
는 반복기 를 가리키는 방금 해제 된 메모리를 역 참조 합니다. , 대신 내가 쓴 것을 시도하십시오.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다