例如,如果我声明一个变量
a=8
:
- 它存储在哪里?在运行进程的堆中吗?
- 它什么时候被释放?
- 谁负责这个?
a=8
堆内存中存储的变量在用户没有显式地删除该变量之前不会被删除,因此如果需要删除,用户需要自己负责。
Bash 2.05使用哈希表来管理变量,哈希表的内存是通过"malloc"和"free"获取和释放的。从哈希表中删除元素并不会立即将其从哈希表中移除,而是在执行的关键点通过垃圾回收flush_hash_table
进行清理。
Bash 版本4.4重新编写了一些哈希表,flush_hash_table
不再存在,但被函数hash_flush
所替代。
因此,不同版本和端口的行为可能不同,不能指望即使使用unset
也能立即释放内存,也不能期望在编写shell脚本时有任何特定的内存行为。
在任何shell语言中,您无需关心内存管理。可以说,bash
负责分配和释放使用的所有内存。
所有解释型语言在堆上存储它们的变量;即使它们使用堆栈,也会在解释器的堆上动态分配。