我使用这个函数Tcl_NewListObj
创建了一个tcl列表,如果我没有这个tcl列表的用途,我该如何清理?我应该在下面的代码中调用listPtr
上的delete吗?
Tcl_Obj* listPtr = Tcl_NewListObj(0,NULL);
// some code where we decide we don't want to use listPtr
delete listPtr; // delete listPtr is OK?
使用Tcl_IncrRefCount()
和Tcl_DecrRefCount()
来管理对象的引用计数;当参考计数减少到小于1的值时,它将被正确地处理。(从零开始;立即的Tcl_DecrRefCount()
会破坏列表。实际的删除函数是TclFreeObj()
,但从不直接调用它。Tcl_DecrRefCount()
会在适当的时候调用它。(
不要delete
对象
那行不通。
Tcl在很多方面都使用per-thread内存领域,尤其是Tcl_Obj
结构(它也有其他优化(,这大大加速了系统,但意味着你必须通过Tcl的API进行分配和释放。
简而言之,这样做:
Tcl_Obj* listPtr = Tcl_NewListObj(0,NULL);
// some code where we decide we don't want to use listPtr
Tcl_DecrRefCount(listPtr);
请注意,如果您决定将列表作为Tcl结果返回,而不是处理它,您可以这样做:
Tcl_SetObjResult(interp, listPtr);
而无需手动管理引用计数。这就是为什么引用计数从零开始的原因。(曾尝试过使用1的初始引用计数,但发现在大大增加代码官僚作风的同时没有任何优势。(
清除不再需要的(对a的引用(Tcl_Obj的正确方法是通过Tcl_DecrRefCount
。在您的情况下:
Tcl_DecrRefCount(listPtr);
在最佳情况下,使用delete
可能会泄漏内存。当在共享值上使用时,它甚至可能在稍后的某个阶段导致程序的分段故障。