2011-06-10 67 views
0

指針的所有權是否僅在我們爲其設置-acquire標誌的塊中持續存在?SWIG + TCL標誌

例如:

{ 
     { 
       $xyz -acquire 
     } 
} 
+0

TCL沒有您認爲它的語法,您可能想嘗試閱讀TCL語法 – 2011-06-12 11:09:05

回答

2

首先,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或更高版本)退出時,綁定對象將被刪除。這取決於你決定這是你真正想要的;如果你以後再沒有處理,你可能應該使用搭配而不是


好,幾乎沒有;一些擴展會造成討厭的事情。因爲它不適用於 SWIG生成的代碼!

+0

嗨Donal感謝您的專家建議。但我堅持一些東西,這真的讓我感到厭煩。其實我用SWIG來調用C++庫中的方法。我正在調用返回指針列表的C++方法。在這種情況下,swig會返回指向該列表的指針。我通過調用wrap.cxx中的list_at和list_size方法從該列表指針中提取所有元素。當我在提取那些我已經提取的指針的「cget -thisown」時,提取這些指針後,我得到0而不是1.所以請在此幫助我。 – 2011-06-12 18:24:28