# include <stdio.h>
# include <stdlib.h>
char *get_ptr ()
{
char *ptr = ( char *)malloc(10);
return ptr;
}
int main ()
{
char *ptr = get_ptr ();
// ...
free (ptr);
return 0;
}
注意:确保释放动态分配的内存 在你不再需要它之后。
[2] 另一个常见的内存管理错误是不正确地释放了指针数组。
示例 3:由于未正确释放指针数组而导致内存泄漏。
# include <stdio.h>
# include <stdlib.h>
int main ()
{
char **ptr_2D = ( char **)calloc(2, sizeof( char *));
*ptr_2D = ( char *)calloc(5, sizeof( char ));
free (ptr_2D); //array of pointers
free (*ptr_2D); //this pointer cannot be accessed anymore
return 0;
}
在这里,内存泄漏是由释放数组引起的,因为它包含的元素不是 在这一点上获得了自由。这样, 程序不再访问动态分配的内存。为了解决这个内存泄漏,我们需要先释放数组内的元素。
示例 4:使用 C 中动态分配的指针释放数组。
# include <stdio.h>
# include <stdlib.h>
int main ()
{
char **ptr_2D = ( char **)calloc(2, sizeof( char *));
*ptr_2D = ( char *)calloc(5, sizeof( char ));
free (*ptr_2D); //freeing elements within the array first
free (ptr_2D); //now the array of pointers can be freed without memory leaks
return 0;
}
[3] 导致内存泄漏的另一个常见错误是重新分配。当我们重新分配一个保存地址的指针到分配的内存时,就会内存泄漏。
示例 5:由于重新分配而导致内存泄漏。
# include <stdio.h>
# include <stdlib.h>
int main ()
{
int *ptr = ( int *)calloc(5, sizeof( int ));
ptr = NULL;
free (ptr); // memory allocated on line 5 is not accessible anymore
return 0;
}
在上面的示例中,指针是指向ptr。这会导致内存泄漏 因为分配的内存无法再释放。要解决此问题的内存泄漏,我们需要释放或设置另一个指针分配的内存,然后再将指针分配给 。
示例 6:重新分配前释放。
# include <stdio.h>
# include <stdlib.h>
int main ()
{
int *ptr = ( int *)calloc(5, sizeof( int ));
free (ptr);
ptr = NULL;
return 0;
}