在循环中重置Tcl_NewObj

ix0qys7i  于 2022-12-03  发布在  其他
关注(0)|答案(1)|浏览(181)

我的目标是做一个列表,但在C中,与Tcl API的帮助。

  • Tcl* 循环:
set listObj {}
for {set i 0} {$i < 10} {incr i} {
    set data {}
    lappend data int $i
    lappend listObj $data
}
# result : {{int 0} {int 1} {int 2} {int 3} {int 4} {int 5} {int 6} {int 7} {int 8} {int 9}}
  • C* 回路:
Tcl_Obj *listObj = Tcl_NewListObj (0,NULL);
for (int i = 0; i < 10; i++) {
    Tcl_Obj* data = Tcl_NewObj();

    Tcl_ListObjAppendElement(interp, data, Tcl_NewStringObj("int", 3));
    Tcl_ListObjAppendElement(interp, data, Tcl_NewIntObj(i)); 

    Tcl_ListObjAppendElement(interp, listObj, data);
    
}

它可以正常工作,但我不知道C代码中的data是否正确使用。在Tcl中,我使用{}来重置变量。
我的问题:如何在Tcl API的帮助下正确重置Tcl_Obj

nwo49xxi

nwo49xxi1#

您的代码没有问题。data变量只是一个指向Tcl_Obj的指针。当它最初使用Tcl_NewObj()创建时,该Tcl_Obj的refCount为0。通过将其追加到listObj,Tcl_ListObjAppendElement()会将refCount递增到1。此时,Tcl_Obj实际上被传递到listObj列表。
如果你想卖弄学问,可以在创建新的Tcl_Obj之后使用Tcl_IncrRefCount(data),然后使用Tcl_DecrRefCount(data)放弃对它的声明。这将显式地重置变量。但是由于你的代码没有做任何可能过早释放变量的事情,所以你可以安全地省略这两个调用。

相关问题