블록 내에서이 메모리 누수를 해결하는 방법은 무엇입니까?

두 아르테 아리 바스

다음과 같은 기능이 있습니다.

STUDENT *getStudents(size_t *numOfStudents){
  STUDENT *students=malloc(sizeof(STUDENT));
  if(students==NULL){
    fprintf(stderr,"Could not allocate memory. Aborting...\n");
    exit(-1);
  }

  FILE *data=fopen("in/data.txt","r");
  for(register size_t i=0;fscanf(data,"%"SCNd32" %"SCNd8,&students[i].num,&students[i].finalGrade)==2;i++){
    ++(*numOfStudents);
    {
      STUDENT *sTemp=realloc(students,*numOfStudents*sizeof(STUDENT));
      if(sTemp==NULL){
        fprintf(stderr,"Could not allocate memory. Aborting...\n");
        exit(-1);
      }
      students=sTemp;
    }
  }
  --(*numOfStudents);
  {
    STUDENT *sTemp=realloc(students,*numOfStudents*sizeof(STUDENT));
    if(sTemp==NULL){
      fprintf(stderr,"Could not allocate memory. Aborting...\n");
      exit(-1);
    }
    students=sTemp;
  }
  return students;
}

로 컴파일 -fsanitize=address하면 메모리 누수 감지

getStudents src / student.c : 27에서

다음 줄입니다.

STUDENT *sTemp=realloc(students,*numOfStudents*sizeof(STUDENT));

블록 안에 있기 때문에 자동으로 메모리를 해제 할 것이라고 생각했습니다. 해제를 시도한 후에도 동일한 문제가 발생합니다.

어떻게 해결할 수 있습니까?

편집하다:

int main(void){
  size_t numOfStudents=1;
  STUDENT *students=getStudents(&numOfStudents);
  printStudents(students,numOfStudents);
  printf("\n================\nMean: %f\n================\n\n",
    (float)getGradeSum(students,numOfStudents)/numOfStudents
  );
  students=removeFailed(students,&numOfStudents);
  printStudents(students,numOfStudents);
  getGradeSum(students,numOfStudents);
  free(students);
  return 0;
}
int32_t getGradeSum(STUDENT *students,size_t numOfStudents){
  if(numOfStudents==1){
    return students[0].finalGrade;
  }
  else{
    return students[numOfStudents-1].finalGrade+getGradeSum(students,numOfStudents-1);
  }
}
말하다

에 의해 가리키는 메모리 students가 자동으로 해제 되었다면 (하지만 C에 그런 것이 없기 때문이 아닙니다), return students매달린 포인터를 반환 할 것이기 때문에 할 수 없습니다 .

함수가하는 일은 올바른 크기의 배열을 동적으로 할당하고 호출자에게 반환하는 것입니다. 따라서을 호출하는 것은 발신자의 책임 free()입니다.

Valgrind는 free()그 기억에 불려진 적이 없다고 말하고 있습니다 .


이제 더 많은 프로그램 (모두는 아님)을 사용할 수 있으므로 범인이 사실상 다음 줄에 있다고 생각합니다.

students=removeFailed(students,&numOfStudents);

아마도 removeFailed전달되는 배열의 (일부) 복사본을 만들기 때문에 주어진 것과 다른 포인터를 반환합니다. 포인터를 해제하지 않기 때문에 인수로 전달되므로 할당이 여전히 존재합니다. 그러나 students(in main) 의 값을 배열 복사본의 주소 로 대체 했으므로 더 이상에서 해당 메모리를 해제 할 수 없습니다 main. 그래서 그것은 확실한 메모리 누수입니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

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

분류에서Dev

이 메모리 누수를 차단하는 방법은 무엇입니까?

분류에서Dev

이 메모리 누수를 피하는 방법은 무엇입니까?

분류에서Dev

각각에 대해 arraylist를 사용할 때 메모리 누수를 피하는 방법은 무엇입니까?

분류에서Dev

파이썬 코드에서 메모리 누수를 감지하는 방법은 무엇입니까?

분류에서Dev

setTimeout 클로저에서 메모리 누수를 수정하는 방법은 무엇입니까?

분류에서Dev

MQTT 앱에서 메모리 누수를 수정하는 방법은 무엇입니까?

분류에서Dev

K.clear_session ()을 사용하여 Keras에서 메모리 누수 문제를 해결하는 방법은 무엇입니까?

분류에서Dev

Colab에서 메모리를 해제하는 방법은 무엇입니까?

분류에서Dev

Android에서 메모리를 해제하는 방법은 무엇입니까?

분류에서Dev

Android에서 메모리를 해제하는 방법은 무엇입니까?

분류에서Dev

Windows 개발 : 내 앱의 메모리 누수 여부를 확인하는 방법은 무엇입니까?

분류에서Dev

NodeJS에서 메모리 내 변수를 업데이트하는 방법은 무엇입니까?

분류에서Dev

Python OpenGL 메모리 누수 문제를 해결하는 방법은 무엇입니까?

분류에서Dev

`signal` 블록 내에서 메소드를 호출하는 방법은 무엇입니까?

분류에서Dev

c에서 연결된 목록 내부의 구조체에 대한 메모리를 할당하는 방법은 무엇입니까?

분류에서Dev

Google에 내 블로거 웹 사이트의 새 도메인으로 결과를 변경하도록 알리는 방법은 무엇입니까?

분류에서Dev

Google에 내 블로거 웹 사이트의 새 도메인으로 결과를 변경하도록 알리는 방법은 무엇입니까?

분류에서Dev

Bash에서 메모리 내 바이너리 검색을 수행하는 방법은 무엇입니까?

분류에서Dev

MySQL이 더 적은 메모리를 사용하도록 만드는 방법은 무엇입니까?

분류에서Dev

MySql에서이 perticular 쿼리를 해결하는 방법은 무엇입니까?

분류에서Dev

PAL 및 CM31 태그의 메모리 누수를 줄이는 방법은 무엇입니까?

분류에서Dev

이 연결 목록을 메모리에서 '삭제'하는 방법은 무엇입니까?

분류에서Dev

Redis 메모리 누수를 확인하는 방법은 무엇입니까?

분류에서Dev

Gradle 플러그인이 특정 블록에 메서드를 추가하는 방법은 무엇입니까?

분류에서Dev

Redis에서 목록의 메모리 크기를 얻는 방법은 무엇입니까?

분류에서Dev

부모 블록 하단에 블록을 짜는 방법은 무엇입니까?

분류에서Dev

하나의 메모리 블록에 정렬 된 여러 번역 단위의 여러 const 객체를 배치하는 방법은 무엇입니까?

분류에서Dev

결과 테이블을 얻기 위해 linq 쿼리를 작성하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

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

  2. 2

    이 메모리 누수를 차단하는 방법은 무엇입니까?

  3. 3

    이 메모리 누수를 피하는 방법은 무엇입니까?

  4. 4

    각각에 대해 arraylist를 사용할 때 메모리 누수를 피하는 방법은 무엇입니까?

  5. 5

    파이썬 코드에서 메모리 누수를 감지하는 방법은 무엇입니까?

  6. 6

    setTimeout 클로저에서 메모리 누수를 수정하는 방법은 무엇입니까?

  7. 7

    MQTT 앱에서 메모리 누수를 수정하는 방법은 무엇입니까?

  8. 8

    K.clear_session ()을 사용하여 Keras에서 메모리 누수 문제를 해결하는 방법은 무엇입니까?

  9. 9

    Colab에서 메모리를 해제하는 방법은 무엇입니까?

  10. 10

    Android에서 메모리를 해제하는 방법은 무엇입니까?

  11. 11

    Android에서 메모리를 해제하는 방법은 무엇입니까?

  12. 12

    Windows 개발 : 내 앱의 메모리 누수 여부를 확인하는 방법은 무엇입니까?

  13. 13

    NodeJS에서 메모리 내 변수를 업데이트하는 방법은 무엇입니까?

  14. 14

    Python OpenGL 메모리 누수 문제를 해결하는 방법은 무엇입니까?

  15. 15

    `signal` 블록 내에서 메소드를 호출하는 방법은 무엇입니까?

  16. 16

    c에서 연결된 목록 내부의 구조체에 대한 메모리를 할당하는 방법은 무엇입니까?

  17. 17

    Google에 내 블로거 웹 사이트의 새 도메인으로 결과를 변경하도록 알리는 방법은 무엇입니까?

  18. 18

    Google에 내 블로거 웹 사이트의 새 도메인으로 결과를 변경하도록 알리는 방법은 무엇입니까?

  19. 19

    Bash에서 메모리 내 바이너리 검색을 수행하는 방법은 무엇입니까?

  20. 20

    MySQL이 더 적은 메모리를 사용하도록 만드는 방법은 무엇입니까?

  21. 21

    MySql에서이 perticular 쿼리를 해결하는 방법은 무엇입니까?

  22. 22

    PAL 및 CM31 태그의 메모리 누수를 줄이는 방법은 무엇입니까?

  23. 23

    이 연결 목록을 메모리에서 '삭제'하는 방법은 무엇입니까?

  24. 24

    Redis 메모리 누수를 확인하는 방법은 무엇입니까?

  25. 25

    Gradle 플러그인이 특정 블록에 메서드를 추가하는 방법은 무엇입니까?

  26. 26

    Redis에서 목록의 메모리 크기를 얻는 방법은 무엇입니까?

  27. 27

    부모 블록 하단에 블록을 짜는 방법은 무엇입니까?

  28. 28

    하나의 메모리 블록에 정렬 된 여러 번역 단위의 여러 const 객체를 배치하는 방법은 무엇입니까?

  29. 29

    결과 테이블을 얻기 위해 linq 쿼리를 작성하는 방법은 무엇입니까?

뜨겁다태그

보관