繁体   English   中英

功能中的可用内存

[英]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 (或newcreate等)开头,然后您将永远知道释放这些函数的结果是您的责任。 只要所有权语义是一致的,定义所有权语义就不是很重要。

在这种情况下,哪种方法才是释放内存的正确方法? 两种方法有什么区别?

两种方法都是正确的。

但是,我更喜欢使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM