对于下面的代码:(1)“main”调用函数“f1”。(2)函数“f1”进行一些数字运算;使用 malloc 创建一个“char”数组,然后将数组的指针返回到 main(不取消分配 - 释放 - 数组)。
我有3个与此案相关的问题:(1)我假设,虽然函数“f1”已经终止,但分配的字符数组仍然保持分配状态,直到主程序完全终止。也就是说,分配的内存仍然属于主进程,没有其他进程可以从外部访问(我的意思是,干扰)它。我对吗?(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);
}
我假设,虽然函数“f1”已经终止,但分配的字符数组仍然保持分配状态,直到主程序完全终止。
真的。动态分配的内存与函数无关,它属于进程。
也就是说,分配的内存仍然属于主进程,其他进程无法从外部访问它。我对吗?
记忆不属于main()
(作为功能)但要处理自身(其中main()
只是入口点)。在具有内存保护的系统中(每个进程与其他进程隔离),无法从外部访问它。但是,您可以以系统特定的方式分配它以跨进程共享内存。
我是否必须在程序终止之前释放数组(在“f1”中分配)(或者主程序终止后立即释放它)?
是的。未分配的内存 -在大多数系统中- 当进程终止时,操作系统会自动释放内存,但这取决于系统。 IMO,即使操作系统这样做,你也应该始终解除分配,使用这种自动解除分配作为危险信号(我忘记了解除分配,这是一个错误吗?我错过了什么?)。而且如果f1
被调用 1000 次,每次都会泄漏内存,很快就会耗尽所有可用内存。想想服务器中的一个进程,它可能(并且应该)启动并运行多年。
如果第二个问题的答案是“是”,那么如何释放在另一个函数中分配的数组?
如果分配内存的人也释放了内存,那就太好了。如果不可能,那么调用者将对此类内存负责。例如,它是什么strdup()
做。在这种情况下,被调用的函数必须(以某种方式)返回指向已分配内存的指针(或可以由另一个专用函数使用的句柄/令牌)。例如:
char* pBuffer = f1();
// Use it
free(pBuffer);
请注意,如果您想隐藏此类内容,有很多技巧internal指针。您可以使用令牌(例如整数、字典中的键)、typedef
或不透明类型。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)