2011-06-10 64 views
0

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

例如:

{ 
     { 
       $xyz -acquire 
     } 
} 
+0

TCL没有您认为它的语法,您可能想尝试阅读TCL语法 – 2011-06-12 11:09:05

回答

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生成的代码!

+0

嗨Donal感谢您的专家建议。但我坚持一些东西,这真的让我感到厌烦。其实我用SWIG来调用C++库中的方法。我正在调用返回指针列表的C++方法。在这种情况下,swig会返回指向该列表的指针。我通过调用wrap.cxx中的list_at和list_size方法从该列表指针中提取所有元素。当我在提取那些我已经提取的指针的“cget -thisown”时,提取这些指针后,我得到0而不是1.所以请在此帮助我。 – 2011-06-12 18:24:28