c - 在 C 中交换动态分配的变量时,临时变量是否需要 free?
问题描述
假设我想交换 a 和 b:
int *a = malloc(sizeof(int));
int *b = malloc(sizeof(int));
int *temp;
*a = 5;
*b = 10;
temp = a;
a = b;
b = temp;
我必须稍后释放 a 和 b,但是在这种情况下 temp 呢?
执行以下操作不会造成任何崩溃:
free(temp);
temp = NULL;
是否必须释放温度?
解决方案
a
、b
或中的任何一个都不temp
需要被释放。命名对象由 C 实现管理。你永远不需要释放它们。
分配的内存malloc
必须被释放1。这是通过将内存地址传递给free
. 这个地址是在a
、b
还是中是完全不相关的temp
。返回的值malloc
是分配内存的地址。您可以将该值复制到许多不同的地方。当您释放内存时,重要的是将该值传递给free
. 它是否在a
、b
或中都没有关系temp
。
脚注
1 C 标准不要求您释放内存,并且在任何通用多用户操作系统中,您在退出进程时不需要释放内存,因为malloc
仅用于在您的进程中组织内存。当进程退出时,操作系统会使用自己的数据结构来回收进程的所有内存。进程内部需要释放内存,以避免在停止使用时浪费它。释放它会释放它以供其他用途。如果您的程序随着时间的推移分配大量内存,则尤其如此 - 当不再需要时未释放的分配内存的积累可能会导致不必要的系统资源使用,并可能导致您的进程和其他进程的性能严重下降。它还可能导致您的程序耗尽可用内存并且无法分配更多内存。在专用嵌入式系统或操作系统内核代码中,可能需要释放分配的内存。
推荐阅读
- sql - 在 Oracle 数据库中插入、删除、更新返回旧值和新值的触发器
- mysql - 1045 - 导入 csv 文件时拒绝用户访问
- python - 有没有办法只用一个 join() 方法使这行代码更简单?
- python - 如何通过另一个模型的 id 过滤模型字段中的某些项目?
- flutter - 收到 Flutter Push Notifications 但没有通知
- angular - Angular 11 – [HMR] 更新失败:NullInjectorError:无 ApplicationRef 提供者
- c# - Mongodb C# - 如何获取最大日期 - (聚合)
- api - 使用 Telegram 向任何电话号码发送个性化消息
- angular - 如何在过滤器管道中检查未找到数据?
- python - Python Tkinter 开启
-Event entry.get() 滞后