正在删除从tcl_NewListObj返回的tcl列表



我使用这个函数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可能会泄漏内存。当在共享值上使用时,它甚至可能在稍后的某个阶段导致程序的分段故障。

最新更新