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

时间:2016-02-14 05:14:56

标签: c pointers memory-leaks

在以下代码中, A 在调用函数 copy()之前具有不同的地址。执行 copy()后,指针 A 获得指针 B 的地址,该地址在 copy()。因此,当 free()执行 free(A)时,它会释放分配给副本中指针 B 的内存( )。现在的问题是如何解除分配 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 

1 个答案:

答案 0 :(得分:4)

  

以下代码中是否有内存泄漏?

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

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()时。此外,让操作系统为您进行清理是一种不好的做法。
  

如何解除分配在main()中指定的指针A?

如何使其有效 - 这是一个建议:

  • B
  • 中声明第二个指针main()
  • 然后调用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两个指针:

free( A );
free( B );