【发布时间】:2019-02-25 12:28:38
【问题描述】:
由于我们无法释放函数中定义的本地指针“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;
}
看完cmets后,我有以下建议的api解决方案。这种做法的目的是我们可能不知道在函数中进行某些计算后数组和值的大小。它的“数据”需要返回到主函数或其他函数。但是,是否还有内存泄漏?
void copyGlobalPtrArray(int** data,
int length)
{
*data = (int*)malloc(length * sizeof(int));
for (int i=0; i<length; i++)
(*data)[i] = i + 10;
}
【问题讨论】:
-
你为
ptrarr分配了两次内存,只释放了一次;所以是的,这将导致内存泄漏。 (您也可以尝试并测量它,例如使用 valgrind)。 -
如果你在一个函数中分配的内存没有在该函数中释放(通常不推荐),返回从函数中的数据,所以您在函数调用时有一个明确的值要分配给它。这样可以更清楚地释放哪些变量。
-
太棒了。您的反馈确实启发了我。谢谢。