[英]Free memory in a function
在这种情况下,哪种方法才是释放内存的正确方法? 两种方法有什么区别?
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;
}
它们是等效的,因为使用malloc
分配和使用free
释放。 allocateArray1
方法在一个函数中完成了所有操作,这使记住内存释放更加容易。 但是有时您需要该函数为main(或其他函数)提供内存,以便可以使用它。 在这种情况下,您只需要稍后将其删除即可,就像allocateArray2
方法一样。
有时这就是所谓的“所有权语义”,即谁拥有对象(因此,谁负责释放对象)。
一些函数要求调用者释放返回的对象,例如strdup()
,有时也释放POSIX getline()
函数。 在这些情况下, strdup()
和getline()
函数不知道您打算如何处理结果或需要使用结果多长时间,因此它们将释放对象的任务委托给功能。
其他库函数可能会返回一个对象,该对象的生存期已由库本身维护,因此无需释放任何内容。
开发具有一致的所有权语义的项目很重要。 例如,委托释放对象任务的任何函数都可以以alloc
(或new
或create
等)开头,然后您将永远知道释放这些函数的结果是您的责任。 只要所有权语义是一致的,定义所有权语义就不是很重要。
在这种情况下,哪种方法才是释放内存的正确方法? 两种方法有什么区别?
两种方法都是正确的。
但是,我更喜欢使用int* allocateArray2(int size, int value)
函数,该函数从函数内部的堆中分配一些内存,并返回指向已分配内存空间的指针。 需要malloc的主要原因是,当您拥有的生命周期必须不同于代码范围时。 您的代码在一个例程中调用malloc,将指针存储在某个地方,最后在另一个例程中调用free。
void allocateArray1(int size, int value)
函数要求一些内存,进行一些处理并在返回之前释放内存,如果size
较小,这不是有效的方法。 您可以在堆栈上创建数组,并将其用于进一步处理。 使用堆栈存储变量的优点是可以为您管理内存。 您不必手动分配内存,也可以在不再需要时释放它。 此外,由于CPU如此高效地组织堆栈存储器,因此读写堆栈变量的速度非常快。 但是,如果您尝试在堆栈上分配的内存超出了应有的数量,例如通过创建太大的局部数组变量,可能会导致堆栈溢出。
C中非常大的堆栈变量的示例:
int foo()
{
double x[1048576];
}
声明的数组消耗8兆字节的数据(假设每个double是8字节); 如果这比堆栈上的可用内存更多(由线程创建参数或操作系统限制设置),则会发生堆栈溢出。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.