【问题标题】:SWIG + TCL flagsSWIG + TCL 标志
【发布时间】:2011-06-10 12:58:42
【问题描述】:

指针的所有权是否只存在于我们为其设置-acquire 标志的块中?

例如:

{
        {
               $xyz -acquire
        }
} 

【问题讨论】:

  • TCL 没有您认为的语法,您可能想尝试阅读 TCL 语法

标签: tcl swig


【解决方案1】:

首先,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 或更高版本)退出时,绑定对象将被删除。由您决定这是否是您真正想要的;如果你以后不承认这个句柄,你可能应该使用 tying。


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

【讨论】:

  • 嗨,Donal 感谢您的专家建议。但我被一些东西所束缚,这真的让我很生气。实际上,我使用 SWIG 来调用 c++ 库中的方法。我正在调用一个返回指针列表的 C++ 方法。在这种情况下,swig 返回我指向该列表的指针。我通过调用 wrap.cxx 中的 list_at 和 list_size 方法从该列表指针中提取所有元素。当我对那些我提取的指针执行“cget -thisown”时提取这些指针后,我得到的是 0 而不是 1。所以请帮我解决这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-05
  • 1970-01-01
相关资源
最近更新 更多