Bash如何管理自己的记忆?

Man*_*ini 5 bash memory-management

例如,如果我声明一个变量a=8:

  • 它存放在哪里?在运行进程堆?
  • 什么时候免费?
  • 谁对此负责?

Sor*_*ren 6

Bash变量就像

a=8
Run Code Online (Sandbox Code Playgroud)

存储为堆内存,除非用户明确unset表示变量,否则永远不会删除它们- 因此,如果需要删除,用户本身负责删除它.

在bash 2.05中,变量通过散列表进行内部管理,其中获取散列表的内存并通过"malloc"和"free"释放.从哈希表中删除元素不会立即从哈希表中删除该元素,但会通过flush_hash_table在执行中的关键点调用的垃圾收集来清除它.

Bash 4.4版本重写了一些哈希表,并且flush_hash_table不再存在,但被一个函数替换hash_flush.

因此,不同的版本和端口可能会有不同的行为,你不应该依赖内存实际上是立即释放,即使你这样做unset,或者在编写shell脚本时期望任何特定的内存行为