如果你不在一个函数中释放动态分配的内存会发生什么?

时间:2014-07-24 08:17:23

标签: c pointers malloc

我正在学习如何用C编写函数来接受一个数组并返回一个修改过的数组。

在函数testfunc中(假设只是将10添加到输入数组b的每个元素))我使用{{为npts个整数分配内存1}}。但是因为我想使用指针返回这个数组,所以我不会在函数结束时释放这个内存。假设我在代码中调用此函数malloc次,那么在代码中分配的所有内存会发生什么?代码100字节使用的内存量是多少?对于不适用于动态内存分配的函数,我认为当函数返回最终值时,分配给变量的内存会消失,再次调用它时,它会再次分配内存等等。但我很困惑在这种情况下会发生什么。

我无法释放函数内部分配的内存,因为我需要它将数组返回到main函数,但是我需要为不同的数组调用此函数超过100次,所以如果它继续分配一次又一次,它将耗尽内存

有没有办法检查代码使用了多少内存? (除了在Mac-OSX上查看Activity Monitor)。

谢谢!

100*10*4

这是避免在函数内部分配内存并且能够多次调用该函数的可能解决方案

/* code to test returning array from functions */

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int* testfunc(int *a,int npts);

int main(int argc, char* argv[])
{
    int *b;
    int a[10],i,j,npts=10;

    b=(int *) malloc(sizeof(int)*npts);

    for (j=0; j <100; j++)
    {
        printf("iteration number %d \n",j);
        for (i=0; i<npts; i++)
        {
            a[i]=i;
            printf("%d \n",a[i]);
        }

        b=testfunc(a,npts);

        printf("returned array \n");
        for (i=0; i<npts; i++)
        {
            printf("%d \n",b[i]);
        }
    }
    printf("the size of one integer is %d \n",sizeof(int));

    return 0;
}
int* testfunc(int *b,int npts)
{
    int *c;
    int i=0;

    c=(int *) malloc(sizeof(int)*npts);

    for (i=0; i<npts; i++)
    {
        c[i]=b[i]+10;
    }

    return c;
}

5 个答案:

答案 0 :(得分:3)

c=(int *) malloc(sizeof(int)*npts);
:
return c;

这会将内存传递给管理它的责任。

调用者(此cae中main)负责在完成后释放它。

你真正的问题在于main

b=(int *) malloc(sizeof(int)*npts);
:
for (some number of iterations)
    b=testfunc(a,npts);  // overwrites b

在“覆盖”行上,您实际上有内存泄漏,因为您无法访问当前为b分配的内存(最初和在循环的前一次迭代中)。


而且,顺便说一句,请不要将malloc的返回值强制转换为C.这不是必需的,可以隐藏某些您 想要的微妙错误必须调试: - )

答案 1 :(得分:2)

由于您使用 malloc ,这意味着您要从而非堆栈分配内存。
首先应该弄清楚堆和堆栈的机制。在C中, malloc 将帮助程序员从堆中分配内存,与C ++中的 new 相同。
因此,即使函数返回最终值,分配的内存也不会被释放。如果您调用该函数100次,它将为您分配内存100次。
至于工具,你可以参考 Valgrind ,这是一个检查是否存在内存错误的强大工具。

答案 2 :(得分:0)

如果未释放动态分配的内存,则会导致内存泄漏,系统将耗尽内存。这可能导致程序崩溃。

答案 3 :(得分:0)

主要是必须释放()分配的空间,但你必须确保在功能期间没有修改空间的值。

答案 4 :(得分:-1)

通过引用调用的目标是修改输入指针并返回给调用者。 表示修改后的值,即仍然使用调用者的地址。

您可以在不使用函数分配内存的情况下进行修改

只是纠正你的第二种方法

void testfunc(int * c,int npts) {     int i = 0;

for (i=0; i<npts; i++)
{
    c[i] += 10; //YOU JUST INCREMENT VALUE by 10 
}

}

我写函数的方法:

  1. 没有内存分配
  2. 没有多重参数
  3. 保留必要的输入,输出参数,返回值
  4. 此处int * c,npts - 输入参数,输出[您的值在int * c位置修改]