SWIG+;TCL标志

SWIG+;TCL标志,tcl,swig,Tcl,Swig,指针的所有权是否仅在为其设置-acquire标志的块中有效 例如: 首先,Tcl不使用{/}定义块。作用域由过程调用或命名空间定义 其次,Tcl命令总是被定义为具有与拥有它们的名称空间相对应的生存期;它们从不†限定为过程调用的范围。必须以这种或那种方式手动处理它们;有两种方法可以执行此手动处理:调用$xyz-delete或重命名$xyz”“(或调用任何其他空字符串)。坦率地说,我更喜欢第一种方法 但是,如果您确实希望将生命周期与过程调用联系在一起,那么这实际上是很有可能做到的。它只需要一些额外的

指针的所有权是否仅在为其设置
-acquire
标志的块中有效

例如:


首先,Tcl不使用
{
/
}
定义块。作用域由过程调用或命名空间定义

其次,Tcl命令总是被定义为具有与拥有它们的名称空间相对应的生存期;它们从不†限定为过程调用的范围。必须以这种或那种方式手动处理它们;有两种方法可以执行此手动处理:调用
$xyz-delete
重命名$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生成的代码

TCL没有您认为的语法,您可以尝试阅读有关TCL syntaxhi Donal的文章,谢谢您的专家建议。但是我坚持做一些事情,这真的让我很生气。实际上,我已经使用了Sigg调用C++库中的方法。我调用C++方法,返回指针列表。在本例中,swig返回指向该列表的指针。我通过调用wrap.cxx中的list_at和list_size方法从该列表指针提取所有元素。当我对已经提取的指针进行“cget-thisown”时,在提取这些指针之后,我得到的是0,而不是1。所以请在这方面帮助我。
tieLifespan $xyz
# You can register multiple objects at once too