如果我们在int main(void)中使用malloc(),我们可以在同一个main函数中释放()动态内存分配。
但现在;
例如,我们将在不同的函数中使用malloc()。我们在int main(void)函数中使用该函数。最后,我应该在哪里free()在以下源代码中分配内存:
#include <stdio.h>
#include <stdlib.h>
int * memory_allocate_function(int);
int main(void){
int n=5; //length of array, 5 for example.
int *my_array;
my_array = memory_allocate_function(n);
return 0;
}
int * memory_allocate_function(int n){
int i;
int *array;
array=(int *)malloc(n*sizeof(int));
if(array==NULL){
printf("can not allocate memory.");
return NULL;
}
//i think i can't use "free(array);" in here. cause of i need that array in main().
return array;
}
我希望我可以告诉你这个问题......你认为最好的方法是什么?
好了你完成它之后 - free
动态分配的内存。但设计明智 - 您可以在其他功能中调用free
来正确管理它。这真的取决于。对此没有硬性规定。
例如,你应该将指针返回到已分配的内存,然后在main
中使用它后,你可以在main()
中释放它。
所以结构会是这样的
int* memory_allocate_function(int n)
{
int i;
int *array;
array = malloc(n*sizeof(int));
if(array == NULL)
{
printf("can not allocate memory.");
exit(0);
}
return array;
}
然后在main()
int main(void)
{
int n=5; //length of array, 5 for example.
int *arr = memory_allocate_function(n);
// work with arr
free(arr);
return 0;
}
但是可以正确命名函数 - 如果你打算使用名称memory_allocate_function
函数,那么只做 - 不应该有任何其他主要逻辑。这有助于创建良好的可读代码。
注意一件事 - 这里当你调用函数然后退出函数时,唯一包含它的地址的局部变量,它的存储持续时间结束,你永远不能访问你分配的内存。这是内存泄漏的情况。如果你确定你不会从函数返回指向内存的指针 - 然后使用它(在相同的函数或不同的函数中)然后释放它(在函数范围结束之前 - 注意没有提到你将在哪里释放它,你可以在相同的功能和其他功能也这样做)。
我不禁要提几件事: - 1)不要施放malloc
的返回值。 2)检查malloc
的返回值 - 如果它是NULL
你想单独处理它。 3)main()
的推荐签名是int main(void)
当不再需要时,应释放内存。
由于在memory_allocate_function
退出后不再可以访问该数组(因为array
未被返回或以其他方式可供外部访问),所以应该在memory_allocate_function
退出之前释放它。
void memory_allocate_function(int n){
int i;
int *array;
array = malloc(n*sizeof(int));
if (array == NULL) {
fprintf(stderr, "Out of memory.");
exit(1);
}
// ... use the array ...
free(array);
}
如果你需要在一个函数中使用malloc
内存而在另一个函数中使用free
,你必须以某种方式小心地将指针传递给malloc
内存,从malloc
点到你想要free
的点。
您有责任保留指针值并将其从一个函数移交给另一个函数,直到达到free
为止。如果你在途中失去了这个价值,你就会有内存泄漏。你现在拥有内存泄漏,因为你没有在任何地方传递本地array
指针。
没有“一种真正的方式”来做,因为它取决于你的具体意图。例如,你可以从memory_allocate_function
返回该指针,接收它main
并最终free
它在那里
int *memory_allocate_function(int);
int main()
{
int n = 5;
int *arr = memory_allocate_function(n);
...
free(arr);
return 0;
}
int *memory_allocate_function(int n)
{
int *array = malloc(n * sizeof *array);
...
return array;
}