在以下代码中, 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
答案 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 );