函数中的空闲内存

时间:2016-04-28 02:45:20

标签: c

在这种情况下,这是释放内存的正确方法;这两种方法有一些区别吗?

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;
}

3 个答案:

答案 0 :(得分:3)

它们是等效的,因为它们都使用free分配并使用allocateArray1发布。 allocateArray2方法在一个函数中完成所有操作,这使得更容易记住释放内存。但有时你需要函数来为main(或其他函数)提供内存,所以它可以使用它。在这种情况下,您只需稍后删除它,就像[...]方法一样。

答案 1 :(得分:1)

这有时被称为“所有权语义”,即拥有对象的人(因此谁负责释放对象)。

某些函数需要调用者释放返回的对象,例如strdup(),或者有时也是POSIX getline()。在这些情况下,strdup()getline()函数无法知道您打算对结果做什么或者您需要多长时间,因此他们将释放对象的任务委托给函数的调用者。

其他库函数可能会返回一个对象,其生命周期已由库本身维护,因此无需释放任何内容。

在开发项目以获得一致的所有权语义时,这很重要。例如,任何委派释放对象任务的函数都可以从alloc(或newcreate等)开始,然后你就会知道释放结果这些功能是你的责任。所有权语义如何定义并不重要,只要它们是一致的。

答案 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字节);如果这个内存多于堆栈上可用的内存(由线程创建参数或操作系统限制设置),则会发生堆栈溢出。