정렬 된 연결 목록의 삽입에서 메모리 누수

Loukritios

정렬 된 연결 목록에 데이터 (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 루프를 변경했으며 노드를 건너 뛰지 않고 여전히 메모리가 누출됩니다.

JohnH

자유 반복자는 노드를 건너 뛰고 루프 본문에는 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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

이중 연결된 구조체 목록의 메모리 누수

분류에서Dev

C에서 연결된 목록에 파일을 읽는 메모리 누수

분류에서Dev

C의 연결된 목록에 삽입 정렬

분류에서Dev

정렬 된 연결 목록을 정렬 된 상태로 유지하면서 다른 정렬 된 목록에 어떻게 삽입 할 수 있습니까?

분류에서Dev

일반화 된 연결 목록에서 메모리 누수를 방지하는 방법은 무엇입니까?

분류에서Dev

C 이중 연결 목록 삽입 정렬 메모리 오류

분류에서Dev

정렬 된 목록의 연결 증명은 스테인리스의 정렬 된 목록입니다.

분류에서Dev

연결된 목록 정렬 된 연결 목록에 노드 삽입

분류에서Dev

Python에서 정렬 된 연결 목록

분류에서Dev

정렬 된 이중 연결 목록에 노드 삽입

분류에서Dev

정렬 된 원형 이중 연결 목록에 요소 삽입

분류에서Dev

C에 정렬 된 연결 목록 삽입

분류에서Dev

C 연결 목록 메모리 누수

분류에서Dev

메모리 누수 연결 목록

분류에서Dev

연결된 목록의 특정 위치에 노드 삽입

분류에서Dev

C에서 정렬되지 않은 연결 목록과 정렬 된 연결 목록의 효율성

분류에서Dev

메모리 누수없이 Fortran FFT (FFTW)에 정렬 된 메모리 사용

분류에서Dev

C 연결 목록의 메모리 누수

분류에서Dev

C #을 사용하여 연결된 목록에서 홀수 짝수 정렬

분류에서Dev

이 정렬 된 연결 목록 삽입을 수정하려면 어떻게합니까?

분류에서Dev

C에서 연결된 목록의 특정 연결 목록에 요소 추가

분류에서Dev

C ++ 연결된 목록에서 주어진 정수의 배수 제거

분류에서Dev

연결된 목록 메모리

분류에서Dev

C에서 단일 연결 목록에 대한 삽입 정렬

분류에서Dev

C ++의 연결된 목록에서 짝수 및 홀수 노드 분리

분류에서Dev

C에서 정렬 된 연결 목록에서 노드 삭제

분류에서Dev

양식의 목록 상자 컨트롤에 연결된 쿼리에 SQL 삽입

분류에서Dev

이중 연결 목록 C ++에서 삽입 정렬

분류에서Dev

c에서 연결된 목록 코드를 사용하는이 삽입 정렬의 문제점은 무엇입니까?

Related 관련 기사

  1. 1

    이중 연결된 구조체 목록의 메모리 누수

  2. 2

    C에서 연결된 목록에 파일을 읽는 메모리 누수

  3. 3

    C의 연결된 목록에 삽입 정렬

  4. 4

    정렬 된 연결 목록을 정렬 된 상태로 유지하면서 다른 정렬 된 목록에 어떻게 삽입 할 수 있습니까?

  5. 5

    일반화 된 연결 목록에서 메모리 누수를 방지하는 방법은 무엇입니까?

  6. 6

    C 이중 연결 목록 삽입 정렬 메모리 오류

  7. 7

    정렬 된 목록의 연결 증명은 스테인리스의 정렬 된 목록입니다.

  8. 8

    연결된 목록 정렬 된 연결 목록에 노드 삽입

  9. 9

    Python에서 정렬 된 연결 목록

  10. 10

    정렬 된 이중 연결 목록에 노드 삽입

  11. 11

    정렬 된 원형 이중 연결 목록에 요소 삽입

  12. 12

    C에 정렬 된 연결 목록 삽입

  13. 13

    C 연결 목록 메모리 누수

  14. 14

    메모리 누수 연결 목록

  15. 15

    연결된 목록의 특정 위치에 노드 삽입

  16. 16

    C에서 정렬되지 않은 연결 목록과 정렬 된 연결 목록의 효율성

  17. 17

    메모리 누수없이 Fortran FFT (FFTW)에 정렬 된 메모리 사용

  18. 18

    C 연결 목록의 메모리 누수

  19. 19

    C #을 사용하여 연결된 목록에서 홀수 짝수 정렬

  20. 20

    이 정렬 된 연결 목록 삽입을 수정하려면 어떻게합니까?

  21. 21

    C에서 연결된 목록의 특정 연결 목록에 요소 추가

  22. 22

    C ++ 연결된 목록에서 주어진 정수의 배수 제거

  23. 23

    연결된 목록 메모리

  24. 24

    C에서 단일 연결 목록에 대한 삽입 정렬

  25. 25

    C ++의 연결된 목록에서 짝수 및 홀수 노드 분리

  26. 26

    C에서 정렬 된 연결 목록에서 노드 삭제

  27. 27

    양식의 목록 상자 컨트롤에 연결된 쿼리에 SQL 삽입

  28. 28

    이중 연결 목록 C ++에서 삽입 정렬

  29. 29

    c에서 연결된 목록 코드를 사용하는이 삽입 정렬의 문제점은 무엇입니까?

뜨겁다태그

보관