Tcl 释放内存
我有一个关于TCL内存管理的基本问题Tcl 释放内存,tcl,Tcl,我有一个关于TCL内存管理的基本问题 假设我有一个Tcl过程。在这个过程中,我声明了一个数组并在其中添加了一些数据。我在那个阵列上做了一些数字运算。我的问题是,在过程返回之前,是否需要手动删除数组?使用: unset <array_name> unset 我的答案是否定的。但我不确定,因为我不知道Tcl中是否有垃圾收集器。有人能对此发表评论吗 在Tcl中使用数组是否不好?我想创建一个列表数组,在阅读关于堆栈溢出的讨论时,有人告诉我使用dict来处理这类东西,但因为我有tcl8.4
unset <array_name>
unset
我的答案是否定的。但我不确定,因为我不知道Tcl中是否有垃圾收集器。有人能对此发表评论吗Tcl确实有垃圾收集(确切的实现是未定义的,无论是引用计数还是其他方法)。因此,不必使用
unset
来避免内存泄漏
我不知道为什么数组会被认为是坏的。您必须提供此类讨论的参考以获得具体评论。不,退出过程时不需要释放本地VAR。它们会自动释放。大多数情况下都是这样,但也有例外(有些扩展可能要求您显式释放内容,有些包(尤其是http)创建需要清理的令牌) 如果在全局命名空间中创建大型数组,则这些数组将不会被释放,因为它们仍然可以访问 在tcl中使用阵列没有问题,但请确保使用的工具正确。在tcl中,数组是一个“关联数组”,也就是说它由字符串索引。如果需要一个由整数索引的C样式数组,一个简单的旧列表可能会更好(可以通过值传递),但是您可能会认为它有点笨拙(下标是命令,而不是带有子关键字的变量引用)
但是,将它们建模为列表列表更有效;
lset
和多索引lindex
允许有效更新和查找结果矩阵的元素。(虽然有点冗长。)如果您处理大量数据,提高的效率可能非常有用。(尽管如此,稀疏矩阵作为Tcl数组可能做得更好。)还请注意,如果您可以升级到8.5,那么那里的许多操作都要快得多(特别是包括测试是否存在具有信息的数组元素
).这是一个讨论:可能是数组,也不错,但如果使用多维,则比dict更麻烦。然而,我没有任何东西可以比较这两种技术的内存管理。哪一个更高效等等?我认为人们在Tcl编程时通常不会太担心效率。如果您使用的是Tcl 8.4,那么使用数组是没有问题的。您只需在持久性上下文(例如,在全局命名空间中)中取消设置生命周期有限的内容,但需要取消设置某些内容(例如,文件句柄、http令牌、对象)在正常情况下需要手动删除。可能是数组,也不错。如果使用多维,则比dict更麻烦。但是,我没有任何东西可以比较这两种技术的内存管理。哪一种更有效?如果你进行“数字运算”,其他一些数据结构有时会更好(例如BLT向量或NAP包中的某些数据),订阅列表非常快,比索引到数组(或字典)快得多。列表很好,但获取数据的步数也会增加。例如,我有这样一个列表:{1234}{56778}
然后要访问2
我必须使用lindex两次。对吗set var2[lindex$mlist 0]
会给我{1 2 3 4}
然后第二个set var2[lindex$var 1]
会给我2
。你可以这样做,或者你可以使用lindex
的多索引形式:set var2[lindex$mlist 0 1]
。如果需要,lset
命令还可以采用多个索引,并且lset
和lindex
都可以采用索引列表作为替代。