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类型.
是的,内存分配有malloc()逗留,直到它被释放.函数如何才能将可变大小的数据返回给调用者?
当程序退出时,它所分配的所有内存都将malloc()被释放.但是,在程序终止之前保留大量不需要的内存通常不是一个好主意,因为它会影响性能,或者系统可能耗尽虚拟内存.对于长时间运行的程序,这可能是一个特别关注的问题,它们的内存使用有时会持续增长,直到它们使用所有可用的虚拟内存.
您调用free()函数返回的指针.所以在你的情况下,main()可以free(fData)在使用数组完成之后做.
这应该都包含在任何C编程类或教科书中.
malloc在堆上分配内存,因此该内存将保持分配状态,直到被free函数或程序成功终止释放为止。
在您的情况下,您释放ftemp了它f1,因此在函数终止后它不再存在。fdata仍在堆上,并且main当您返回指向该分配位置的指针时可以访问它。
一旦main成功终止,所指向的内存就会fdata被释放。
因此,当您不再需要内存时,最好立即释放它。在程序结束时释放块是没有意义的,因为当进程终止时,程序的所有空间都会返回给系统(考虑现代操作系统)。
| 归档时间: |
|
| 查看次数: |
17295 次 |
| 最近记录: |