2011-06-10 3 views
0

포인터의 소유권은 -acquire 플래그를 설정 한 블록에서만 지속됩니까?SWIG + TCL 플래그

{ 
     { 
       $xyz -acquire 
     } 
} 
+0

TCL에는 생각하는 구문이 없으므로 전문가의 조언에 따라 TCL 구문 –

답변

2

첫째

예는 : Tcl은 {/}로 블록을 정의하지 않습니다. 범위는 프로 시저 호출 또는 네임 스페이스에 의해 정의됩니다.

둘째, Tcl 명령은 항상 소유하고있는 네임 스페이스에 해당하는 수명을 갖도록 정의됩니다. 프로 시저 호출 범위가 입니다. 그들은 수동으로 어느 방향으로 배치되어야합니다. 이 수동 처리를 수행하는 두 가지 방법이 있습니다. $xyz -delete 또는 rename $xyz "" (또는 빈 문자열 인 다른 것)으로 전화하십시오. 솔직히 나는 첫 번째 방법을 선호합니다.

그러나 수명을 프로 시저 호출에 연결하려면 실제로 그렇게 할 수 있습니다. 당신은 당신이 $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 "" 
    } 
} 

: 그것은 단지 약간의 추가 코드가 필요

tieLifespan $xyz 
# You can register multiple objects at once too 

을 그리고 그것 뿐이다. Tcl 8.5 또는 이후 버전을 사용하는 경우 절차 (또는 프로 시저와 유사한 엔티티)가 종료되면 묶인 객체가 삭제됩니다. 그것이 당신이 정말로 원하는 것인지 결정하는 것은 당신에게 달려 있습니다. 나중에 핸들을 부인하면 이 아니라 묶는 것이 좋습니다.


잘 †, 좀처럼; 일부 확장은 불쾌한 일을합니다. 이 문장을 으로 할인하지 마십시오. SWIG 생성 코드에이 적용되지 않습니다!

+0

안녕하십니까. 그러나 나는 무언가에 붙어 있고 정말 나를 화나게하고있다. 사실 SWIG를 사용하여 C++ 라이브러리에서 메서드를 호출했습니다. 그리고 포인터 목록을 반환하는 C++ 메서드를 호출합니다. 이 경우 swig는 그 목록에 대한 포인터를 반환합니다. 그리고 wrap.cxx에있는 list_at 및 list_size 메서드를 호출하여 해당 목록 포인터에서 모든 요소를 ​​추출합니다. 그리고 내가 추출한 포인터의 "cget -thisown"을 수행 할 때 그 포인터를 추출한 후에 나는 1 대신 0을 얻고 있습니다. 제발 친절하게 도와주세요. –