SWIG + TCL标志

时间:2011-06-10 12:58:43

标签: tcl swig

指针的所有权是否仅在我们为其设置-acquire标志的块中持续?

例如:

{
        {
               $xyz -acquire
        }
} 

1 个答案:

答案 0 :(得分:2)

首先,Tcl没有使用{ / }定义块。范围由过程调用或命名空间定义。

其次,Tcl命令总是被定义为具有与拥有它们的命名空间相对应的生命周期;它们永远不会作用于程序调用。它们必须以某种方式手动处理;有两种方法可以执行此手动处理:调用$xyz -deleterename $xyz ""(或其他任何空字符串)。坦率地说,我更喜欢第一种方法。

但是如果你确实希望将生命周期与程序调用联系起来,那实际上很可能会这样做。它只需要一些额外的代码:

proc tieLifespan args {
    upvar 1 "____lifespan handle" v
    if {[info exists v]} {
        trace remove variable v unset $v
        set args [concat [lindex $v 1] $args]
    }
    set v [concat Tie-Garbage-Collect $args]
    trace add variable v unset $v
}
proc Tie-Garbage-Collect {handles var dummy1 dummy2} {
    upvar 1 $var v
    foreach handle $handles {
        # According to SWIG docs, this is how to do explicit destruction
        $handle -delete
        # Alternatively: rename $handle ""
    }
}

你想在$xyz生命的范围内使用这样的范围:

tieLifespan $xyz
# You can register multiple objects at once too

就是这样。当程序(或类似过程的实体,如果您使用的是Tcl 8.5或更高版本)退出时,绑定的对象将被删除。由你决定这是否是你真正想要的;如果你以后拒绝了句柄,你可能应该使用绑定。


好吧,几乎没有;一些扩展做了讨厌的事情。将此声明折扣为不适用到SWIG生成的代码!