Tcl 释放内存

Tcl 释放内存,tcl,Tcl,我有一个关于TCL内存管理的基本问题 假设我有一个Tcl过程。在这个过程中,我声明了一个数组并在其中添加了一些数据。我在那个阵列上做了一些数字运算。我的问题是,在过程返回之前,是否需要手动删除数组?使用: unset <array_name> unset 我的答案是否定的。但我不确定,因为我不知道Tcl中是否有垃圾收集器。有人能对此发表评论吗 在Tcl中使用数组是否不好?我想创建一个列表数组,在阅读关于堆栈溢出的讨论时,有人告诉我使用dict来处理这类东西,但因为我有tcl8.4

我有一个关于TCL内存管理的基本问题

  • 假设我有一个Tcl过程。在这个过程中,我声明了一个数组并在其中添加了一些数据。我在那个阵列上做了一些数字运算。我的问题是,在过程返回之前,是否需要手动删除数组?使用:

    unset <array_name>
    
    unset
    
    我的答案是否定的。但我不确定,因为我不知道Tcl中是否有垃圾收集器。有人能对此发表评论吗

  • 在Tcl中使用数组是否不好?我想创建一个列表数组,在阅读关于堆栈溢出的讨论时,有人告诉我使用dict来处理这类东西,但因为我有tcl8.4,所以我不能。Tcl中的阵列有什么问题


  • Tcl确实有垃圾收集(确切的实现是未定义的,无论是引用计数还是其他方法)。因此,不必使用
    unset
    来避免内存泄漏


    我不知道为什么数组会被认为是坏的。您必须提供此类讨论的参考以获得具体评论。

    不,退出过程时不需要释放本地VAR。它们会自动释放。大多数情况下都是这样,但也有例外(有些扩展可能要求您显式释放内容,有些包(尤其是http)创建需要清理的令牌)

    如果在全局命名空间中创建大型数组,则这些数组将不会被释放,因为它们仍然可以访问

    在tcl中使用阵列没有问题,但请确保使用的工具正确。在tcl中,数组是一个“关联数组”,也就是说它由字符串索引。如果需要一个由整数索引的C样式数组,一个简单的旧列表可能会更好(可以通过值传递),但是您可能会认为它有点笨拙(下标是命令,而不是带有子关键字的变量引用)

  • 假设我有一个Tcl过程。在这个过程中,我声明了一个数组并在其中添加了一些数据。我在那个阵列上做了一些数字运算。我的问题是,在过程返回之前,是否需要手动删除数组
  • 否。当过程返回时将删除它(即,其寿命限制为堆栈帧的寿命)。如果愿意,您可以提前取消设置它,这将释放它的内存,但您不需要这样做

  • 在Tcl中使用数组是否不好?我想创建一个列表数组,在阅读关于堆栈溢出的讨论时,有人告诉我使用dict来处理这类东西,但因为我有tcl8.4,所以我不能。Tcl中的阵列有什么问题
  • 数组在8.4中是绝对好的,只要您记住它们是实现从任意字符串键到变量的映射的集合。DICT适用于需要一个值来保存从字符串到任意值的映射的情况。(大约在8.4中有一个dict扩展。)通过选择一些字符作为子索引之间的分隔符(例如,逗号),可以使用数组对矩阵进行建模,这种技术已经被许多人使用,效果非常好


    但是,将它们建模为列表列表更有效;
    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
    都可以采用索引列表作为替代。