gpt4 book ai didi

c - 如何避免函数返回数组时的内存泄漏

转载 作者:太空宇宙 更新时间:2023-11-04 01:23:51 25 4
gpt4 key购买 nike

在下面的代码中,指针 A 在调用函数 copy() 之前有不同的地址。一旦 copy() 被执行,指针 A 就得到了 copy() 中声明的指针 B 的地址>。因此,在 main() 中,当执行 free(A) 时,它会释放分配给 copy( )。现在的问题是如何释放 main() 中分配的指针 A ?以下代码是否存在内存泄漏?如何预防?

代码如下:

#define size 10
int *copy(int *A){
int i;
int *B = (int *)calloc(size,sizeof(int));
printf("address of B=%p\n",B);
for(i=0;i<size;i++){
B[i]=A[i]+1;
}
for(i=0;i<size;i++){
printf("%d ",B[i]);
}
printf("\n ");
return B;
}

int main(){
int i;
int *A = (int *)calloc(size,sizeof(int));
printf("address of A before copy()=%p\n",A);

for(i=0;i<size;i++){
A[i] = i;
}
A=copy(A);
printf("address of A after copy()=%p\n",A);
for(i=0;i<size;i++){
printf("%d ",A[i]);
}
printf("\n");
free(A);
return 0;
}

这是输出:

   address of A before copy()=0x1e64010
address of B=0x1e64040
1 2 3 4 5 6 7 8 9 10
address of A after copy()=0x1e64040
1 2 3 4 5 6 7 8 9 10

最佳答案

Is there any memory leaks in the following code?

是的,这些行可能存在内存泄漏:

int *A = (int *)calloc(size,sizeof(int));

int *A = copy(A); // <-- Do NOT allocate and then point the pointer to somewhere else

那是因为你为 A 分配了内存,然后你将 A 指向其他地方,从而失去了释放内存的句柄最初 已分配。

注意:

  • 不过,在这种特殊情况下,您可能会侥幸逃脱,因为它发生在 main() 中 - 并且当程序退出时,操作系统本身可能会释放内存。
  • 但一般来说,这种代码会导致内存泄漏,尤其是当函数不是main() 时。此外,让操作系统为您进行清理也是一种不好的做法。

how to deallocate pointer A assigned within main() ?

如何让它发挥作用 - 这是一个建议:

  • main()
  • 中声明第二个指针 B
  • 然后调用copy从原始数组中复制/修改内容。

代码应该是这样的:

 int *A = (int *)calloc(size,sizeof(int));

// Initialize A
for( i=0;i<size;i++ )
{
A[i] = i;
}

// Copy A to B, and modify the content.
int *B = copy(A); // <-- 2nd pointer

最后,释放两个指针:

free( A );
free( B );

关于c - 如何避免函数返回数组时的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35388607/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com