다음과 같은 기능이 있습니다.
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] 삭제
몇 마디 만하겠습니다