SWIG + TCL флаги

Владение указателем будет длиться только в блоке, в котором мы установили -acquire флаг за это?

Например.:

{
        {
               $xyz -acquire
        }
} 

1 ответ

Во-первых, 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-коду!

Другие вопросы по тегам