指针的所有权是否仅在我们为其设置-acquire
标志的块中持续?
例如:
{
{
$xyz -acquire
}
}
答案 0 :(得分:2)
首先,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或更高版本)退出时,绑定的对象将被删除。由你决定这是否是你真正想要的;如果你以后拒绝了句柄,你可能应该不使用绑定。
†好吧,几乎没有;一些扩展做了讨厌的事情。将此声明折扣为不适用到SWIG生成的代码!