함수에서 정의하는 로컬 포인터 "tmparr"을 해제 할 수 없으므로 메모리 누수가 발생합니까? 확실하지 않습니다 더 나은 코딩 솔루션을 여기에 있습니다.함수에서 배열을 반환하면 메모리 누수가 발생합니까?
함수에 대한 포인터를 전달하려고하므로 함수 내부의 데이터도 처리 및 변경됩니다. 데이터 및 값의 크기는 함수 내에서 유연하게 수정할 수 있습니다.
void printArray(int* data,
int length)
{
for (int i=0; i<length; i++) {
if ((i>0) && (i%5==0))
printf("\n");
printf("%d ", data[i]);
}
printf("\n\n");
}
void copyPassPtrArray(int** data,
int length)
{
int* tmparr = (int*)malloc(length * sizeof(int));
for (int i=0; i<length; i++)
tmparr[i] = i + 10;
*data = tmparr;
}
int main()
{
int length = 10;
int* ptrarr = (int*)malloc(length * sizeof(int));
for (int i =0; i <length; i++)
ptrarr[i] = i;
printf("Origin ... \n");
printArray(ptrarr, length);
copyPassPtrArray(&ptrarr, 20);
printf("After copyPassPtrArray ... \n");
printArray(ptrarr, 20);
free(ptrarr);
return 0;
}
코멘트를 읽은 후, 나는 다음과 같은 제안 API 솔루션을 가지고있다. 이 연습의 목적은 배열의 크기와 함수의 특정 계산 후 값이 무엇인지 모를 수 있다는 것입니다. "데이터"는 메인 또는 다른 기능으로 돌아갈 필요가 있습니다. 그러나 더 이상 메모리 누수가 있습니까?
void copyGlobalPtrArray(int** data,
int length)
{
*data = (int*)malloc(length * sizeof(int));
for (int i=0; i<length; i++)
(*data)[i] = i + 10;
}
자신을 누설; 그래서 네, 이것은 메모리 누수를 초래할 것입니다. (valgrind를 사용하여 시도해보고 측정 할 수도 있습니다.) – Evert
* 해당 함수에서 해제되지 않은 함수에 메모리를 할당하는 경우 (일반적으로 권장하지 않음) 함수에서 해당 데이터를 반환하므로 함수 호출 시점에 할당 할 명시 적 값을 갖습니다. 따라서 변수를 없앨 수 있습니다. – Evert
좋아요. 당신의 피드백은 분명히 나를 깨우쳐주었습니다. 고맙습니다. – Fusionmate