我有一个关于TCL内存管理的基本问题。
假设我有一个Tcl程序。在程序中我声明了一个数组并在其中添加了一些数据。我在那个数组上做了一些数字运算。我的问题是在程序返回之前我需要手动删除数组吗?使用:
unset <array_name>
我的回答是否定的。但我不确定,因为我不知道Tcl中是否有垃圾收集器。任何人都可以对此发表评论。
在Tcl中使用数组不好吗?我想创建列表数组,在阅读有关堆栈溢出的讨论时,人们告诉他们使用dict来获取这些东西但是因为我有Tcl 8.4我不能。 Tcl中的数组有什么问题?
答案 0 :(得分:3)
- 假设我有一个Tcl程序。在程序中我声明了一个数组并在其中添加了一些数据。我在那个数组上做了一些数字运算。我的问题是在程序返回之前我需要手动删除数组吗?
醇>
没有。当过程返回时它将被删除(即,它的寿命限制为堆栈帧的寿命)。如果你愿意,你可以提前unset
,然后释放它的内存,但你不需要 来做这件事。
- 在Tcl中使用数组不好吗?我想创建列表数组,在阅读有关堆栈溢出的讨论时,人们告诉他们使用dict来获取这些东西但是因为我有Tcl 8.4我不能。 Tcl中的数组有什么问题?
醇>
只要你记得它们是一个实现从任意字符串键到变量的映射的集合,在8.4中绝对可以使用数组。 Dicts适用于需要值的情况,该值包含从字符串到任意值的映射。 (在某处有一个关于8.4的字典扩展。)你可以使用数组来模拟矩阵,选择一些字符作为子索引之间的分隔符(例如逗号),这种技术已经被很多人使用,效果很好。 / p>
然而将它们建模为列表列表更为有效; lset
和多索引lindex
允许有效更新和查找结果矩阵的元素。 (虽然它有点冗长。)如果你正在处理大量数据,那么提高效率会非常有用。 (尽管如此,稀疏矩阵可能更好地作为Tcl数组完成。)另请注意,如果可以升级到8.5,那么许多操作的速度要快得多(尤其包括使用{{1测试数组元素的存在性) }})。
答案 1 :(得分:2)
Tcl确实有垃圾收集(确切的实现是未定义的,无论是引用计数还是其他方法)。所以不,你不必使用unset
来避免内存泄漏。
我不确定为什么阵列会被认为是坏的。您必须提供此类讨论的参考,以获得具体的评论。
答案 2 :(得分:1)
不,退出程序时不需要释放本地变量。它们会自动释放。大多数情况下都是这种情况,但也有例外(某些扩展可能要求您明确地释放内容,而某些包,特别是http,创建需要清理的令牌)
如果在全局命名空间中创建大型数组,则不会释放这些数组,因为它们仍然可以被访问。
在tcl中使用数组没有问题,但请确保使用正确的工具。在tcl中,数组是一个“关联数组”,即它是由字符串索引的。如果你需要一个由整数索引的c风格数组,一个普通的旧列表可能会更好(你可以通过值传递它)但你可能会认为它有点笨拙(下标是一个命令而不是一个带有子键的变量引用)< / p>