在函数返回后,函数中分配的内存是否仍然保持分配状态?

ssd*_*ssd 13 c arrays malloc function

对于下面的代码: (1) "main"调用函数"f1". (2)函数"f1"做一些数字运算; 使用malloc创建一个"char"数组,然后将数组的指针返回给main(不分配-freeing-数组).

我有3个与案例相关的问题: (1)我假设,虽然函数"f1"已经终止,但分配的char数组仍然保持分配状态,直到主程序完全终止.也就是说,分配的内存仍然属于主内存,没有其他进程可以从外部访问(我的意思是,干扰)它.我对吗? (2)在程序终止之前是否必须释放数组(在"f1"中分配)(或者在主程序终止后它是否被释放)? (3)如果第二个问题的答案是"是",那么如何释放在另一个函数中分配的数组?

注意:我希望保持在纯c的范围内,而不是溢出到c ++.

char *f1 (...) {
    ...
    ...
    char *fTmp = malloc (length1 * sizeof (char));
    char *fData = malloc (length2 * sizeof (char));
    ...
    ...
    free (fTmp);
    return (fData);
}

int main () {
    char *fData = f1 (...);
    ...
    return (0);
}
Run Code Online (Sandbox Code Playgroud)

Adr*_*tti 19

我假设,虽然函数"f1"已经终止,但分配的char数组仍然保持分配状态,直到主程序完全终止.

真正.动态分配的内存与函数无关,它属于进程.

也就是说,分配的内存仍然属于主内存,没有其他进程可以从外部访问它.我对吗?

内存不属于main()(意图作为函数),而是处理自身(其中main()只是入口点).在具有内存保护的系统中(每个进程与其他进程隔离),无法从外部访问.但是,您可以以特定于系统的方式分配它,以跨进程共享内存.

在程序终止之前是否必须释放数组(在"f1"中分配)(或者在主程序终止后它是否会被释放)?

是.未分配的内存 - 在大多数系统中 - 在进程终止时由操作系统自动释放,但这取决于系统.IMO甚至在操作系统执行时你应该总是解除分配,使用这样的自动释放作为红旗(我忘记了解除分配,这是一个错误吗?我错过了什么?).此外,如果f1被调用1000次,每次快速吃掉所有可用内存都会泄漏内存.想想服务器中的进程,它可能(并且应该)启动并运行多年.

如果第二个问题的答案是"是",那么如何释放在另一个函数中分配的数组?

分配内存的同时释放它也很好.如果不可能,则调用者将对此类内存负责.例如,它是strdup()做什么的.在这种情况下,被调用的函数必须返回(以某种方式)指向已分配内存的指针(或可由另一个专用函数使用的句柄/令牌).例如:

char* pBuffer = f1();
// Use it
free(pBuffer);
Run Code Online (Sandbox Code Playgroud)

请注意,如果要隐藏此类内部指针,有许多技术.您可以使用标记(例如,整数,字典中的键),a typedef或opaque类型.

  • 我做的是同样的事情; 也就是说,我使用通过**传递的指针在另一个进程中创建的一个进程中释放了数组**.我不确定我一直在做的是正确的方式.所以,你的方法似乎是最接近的答案:"当分配内存时,释放它也很好.如果不可能,那么调用者将负责这样的内存." (2认同)

Bar*_*mar 6

  1. 是的,内存分配有malloc()逗留,直到它被释放.函数如何才能将可变大小的数据返回给调用者?

  2. 当程序退出时,它所分配的所有内存都将malloc()被释放.但是,在程序终止之前保留大量不需要的内存通常不是一个好主意,因为它会影响性能,或者系统可能耗尽虚拟内存.对于长时间运行的程序,这可能是一个特别关注的问题,它们的内存使用有时会持续增长,直到它们使用所有可用的虚拟内存.

  3. 您调用free()函数返回的指针.所以在你的情况下,main()可以free(fData)在使用数组完成之后做.

这应该都包含在任何C编程类或教科书中.


hac*_*cks 5

malloc在堆上分配内存,因此该内存将保持分配状态,直到被free函数或程序成功终止释放为止。
在您的情况下,您释放ftemp了它f1,因此在函数终止后它不再存在。fdata仍在堆上,并且main当您返回指向该分配位置的指针时可以访问它。

一旦main成功终止,所指向的内存就会fdata被释放。

因此,当您不再需要内存时,最好立即释放它。在程序结束时释放块是没有意义的,因为当进程终止时,程序的所有空间都会返回给系统(考虑现代操作系统)。