此代码是否会造成内存泄漏以及如何测试它
Can this code create memory leak and how to test it
您好,我有一个源代码 C,如下所示:
#include <stdio.h>
#include <stdlib.h>
void test(int *a,int n)
{
a=(int*)malloc(n * sizeof(int));
for(int i=0;i<n;i++)
a[i] = i+1;
}
int main()
{
int *ptr;
int n;
n = 5;
printf("Enter number of elements: %d\n", n);
test(ptr,n);
if (ptr == NULL) {
printf("Memory not allocated.\n");
}
else {
//...
}
return 0;
}
据我了解,当我们调用函数test时,程序会创建一个pointer
ptr的影子放在test里面,然后当我们走出test时,ptr的影子会被删除,所以在main()
ptr 仍然是 NULL
,但是在测试中我们有 malloc
ptr 的内存,这个内存在 heap
中,当我们出去时它不是免费的的测试。因此,如果我多次调用测试,这将导致内存泄漏,这是真的吗?以及如何在主函数中使用 free()
函数释放此内存?
void test(int *a,int n)
{
a=(int*)malloc(n * sizeof(int));
for(int i=0;i<n;i++)
a[i] = i+1;
}
这肯定会导致内存泄漏!。在存在测试函数之前未遇到对 free(void* buffer)
的调用。您正在获取用户指针的副本,因为在 C 中 evrey 是 passed by value
,这意味着复制指针 a
上的每个操作都不会镜像或影响 calle 指针 (ptr
) .如何修复?
更改函数签名以接收双指针!如果 malloc 成功分配,则在 rturn 从 main 之前调用 free()
。
记住:始终检查 malloc()
系统调用 return !!
查看以下修复:
#include <stdio.h>
#include <stdlib.h>
void test(int **a,int n)
{
int* temp=(int*)malloc(n * sizeof(int));
if(!temp) /*always check malloc system call return*/
{
*a = NULL;
return;
}
*a = temp;
for(int i=0;i<n;i++)
a[i] = i+1;
}
int main()
{
int* ptr = NULL;
...
test(&ptr, n);
if(!ptr){
perror("malloc failed"); /*write to standard error*/
exit(EXIT_FAILURE);
}
... do work ..
/*if we reach this code it means that malloc succedd then free the ptr which points to the previous allocated heap buffer*/
free(ptr);
return 0;
}
As my understanding, when we call function test, the program will create a shadow of pointer ptr to put inside test and then when we go out of test the shadow of ptr will be delete so in the main() the ptr still be NULL, but inside the test we have malloc a memory for ptr and this memory is in the heap and it is not free when we go out of test. So if i call test many time this will make memory leak is this true ?
您的理解是正确的。调用一次函数就足以导致内存泄漏。
And how can i free this memory with free() function in the main ?
您必须 return 指向调用者的指针才能启用它。看到这个:
您好,我有一个源代码 C,如下所示:
#include <stdio.h>
#include <stdlib.h>
void test(int *a,int n)
{
a=(int*)malloc(n * sizeof(int));
for(int i=0;i<n;i++)
a[i] = i+1;
}
int main()
{
int *ptr;
int n;
n = 5;
printf("Enter number of elements: %d\n", n);
test(ptr,n);
if (ptr == NULL) {
printf("Memory not allocated.\n");
}
else {
//...
}
return 0;
}
据我了解,当我们调用函数test时,程序会创建一个pointer
ptr的影子放在test里面,然后当我们走出test时,ptr的影子会被删除,所以在main()
ptr 仍然是 NULL
,但是在测试中我们有 malloc
ptr 的内存,这个内存在 heap
中,当我们出去时它不是免费的的测试。因此,如果我多次调用测试,这将导致内存泄漏,这是真的吗?以及如何在主函数中使用 free()
函数释放此内存?
void test(int *a,int n)
{
a=(int*)malloc(n * sizeof(int));
for(int i=0;i<n;i++)
a[i] = i+1;
}
这肯定会导致内存泄漏!。在存在测试函数之前未遇到对 free(void* buffer)
的调用。您正在获取用户指针的副本,因为在 C 中 evrey 是 passed by value
,这意味着复制指针 a
上的每个操作都不会镜像或影响 calle 指针 (ptr
) .如何修复?
更改函数签名以接收双指针!如果 malloc 成功分配,则在 rturn 从 main 之前调用 free()
。
记住:始终检查 malloc()
系统调用 return !!
查看以下修复:
#include <stdio.h>
#include <stdlib.h>
void test(int **a,int n)
{
int* temp=(int*)malloc(n * sizeof(int));
if(!temp) /*always check malloc system call return*/
{
*a = NULL;
return;
}
*a = temp;
for(int i=0;i<n;i++)
a[i] = i+1;
}
int main()
{
int* ptr = NULL;
...
test(&ptr, n);
if(!ptr){
perror("malloc failed"); /*write to standard error*/
exit(EXIT_FAILURE);
}
... do work ..
/*if we reach this code it means that malloc succedd then free the ptr which points to the previous allocated heap buffer*/
free(ptr);
return 0;
}
As my understanding, when we call function test, the program will create a shadow of pointer ptr to put inside test and then when we go out of test the shadow of ptr will be delete so in the main() the ptr still be NULL, but inside the test we have malloc a memory for ptr and this memory is in the heap and it is not free when we go out of test. So if i call test many time this will make memory leak is this true ?
您的理解是正确的。调用一次函数就足以导致内存泄漏。
And how can i free this memory with free() function in the main ?
您必须 return 指向调用者的指针才能启用它。看到这个: