【发布时间】:2011-06-10 12:58:42
【问题描述】:
指针的所有权是否只存在于我们为其设置-acquire 标志的块中?
例如:
{
{
$xyz -acquire
}
}
【问题讨论】:
-
TCL 没有您认为的语法,您可能想尝试阅读 TCL 语法
指针的所有权是否只存在于我们为其设置-acquire 标志的块中?
例如:
{
{
$xyz -acquire
}
}
【问题讨论】:
首先,Tcl 没有用{/} 定义块。范围由过程调用或命名空间定义。
其次,Tcl 命令总是被定义为具有对应于拥有它们的命名空间的生命周期;它们永远不会† 作用于过程调用。它们必须以一种或另一种方式手动处理;有两种方法可以手动处理:调用$xyz -delete 或rename $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 或更高版本)退出时,绑定对象将被删除。由您决定这是否是您真正想要的;如果你以后不承认这个句柄,你可能应该不使用 tying。
† 好吧,几乎没有;一些扩展会做一些讨厌的事情。折扣此声明,因为它不适用于 SWIG 生成的代码!
【讨论】: