在这种情况下,这是释放内存的正确方法;这两种方法有一些区别吗?
void allocateArray1(int size, int value)
{
int* arr = malloc(size * sizeof(int));
/* ... */
free(arr);
}
int* allocateArray2(int size, int value)
{
int* arr = malloc(size * sizeof(int));
/* ... */
return arr;
}
int main()
{
int* vector = allocateArray2(5,45);
free(vector);
allocateArray1(5,45);
return 0;
}
答案 0 :(得分:3)
它们是等效的,因为它们都使用free
分配并使用allocateArray1
发布。 allocateArray2
方法在一个函数中完成所有操作,这使得更容易记住释放内存。但有时你需要函数来为main(或其他函数)提供内存,所以它可以使用它。在这种情况下,您只需稍后删除它,就像[...]
方法一样。
答案 1 :(得分:1)
这有时被称为“所有权语义”,即拥有对象的人(因此谁负责释放对象)。
某些函数需要调用者释放返回的对象,例如strdup()
,或者有时也是POSIX getline()
。在这些情况下,strdup()
和getline()
函数无法知道您打算对结果做什么或者您需要多长时间,因此他们将释放对象的任务委托给函数的调用者。
其他库函数可能会返回一个对象,其生命周期已由库本身维护,因此无需释放任何内容。
在开发项目以获得一致的所有权语义时,这很重要。例如,任何委派释放对象任务的函数都可以从alloc
(或new
或create
等)开始,然后你就会知道释放结果这些功能是你的责任。所有权语义如何定义并不重要,只要它们是一致的。
答案 2 :(得分:0)
在这种情况下,这是释放内存的正确方法;这两种方法有一些区别吗?
两种方法都是正确的。
但是,我更喜欢使用int* allocateArray2(int size, int value)
函数,该函数从函数内的堆中分配一些内存,并返回指向已分配内存空间的指针。
需要malloc的主要原因是,您的数据必须具有与代码范围不同的生命周期。您的代码在一个例程中调用malloc,将指针存储在某处,最终在另一个例程中调用free。
void allocateArray1(int size, int value)
函数要求一些内存,如果size
较小,则在返回之前进行一些处理并释放内存不是有效的方法。您可以在堆栈上创建数组,并将其用于进一步处理。使用堆栈存储变量的优点是可以为您管理内存。你不必手动分配记忆,或者一旦你不再需要它就把它释放出来。更重要的是,因为CPU如此有效地组织堆栈内存,读取和写入堆栈变量非常快。但是,如果您尝试在堆栈上分配的内存超过适合的内存,则可能会导致堆栈溢出,例如,通过创建过大的本地数组变量。
C中非常大的堆栈变量的示例:
int foo()
{
double x[1048576];
}
声明的数组消耗8兆字节的数据(假设每个双字节为8字节);如果这个内存多于堆栈上可用的内存(由线程创建参数或操作系统限制设置),则会发生堆栈溢出。