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-коду!