我使用这个函数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?发布于 2021-04-23 14:12:20
使用Tcl_IncrRefCount()和Tcl_DecrRefCount()来管理对象的引用计数;当引用计数降到小于1的值时,它将被正确地释放。(从零开始;立即Tcl_DecrRefCount()将销毁列表。实际的删除函数是TclFreeObj(),但从不直接调用它。Tcl_DecrRefCount()会在适当的时候调用它。)
delete,,,,,,the object!,无法工作的对象。
Tcl在很多方面都使用每线程内存,特别是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的初始引用计数,但发现在大大增加代码官僚性的同时,没有提供任何优势。)
发布于 2021-04-23 09:43:58
清除不再需要的(引用) Tcl_Obj的正确方法是通过Tcl_DecrRefCount。就你而言:
Tcl_DecrRefCount(listPtr);在最好的情况下,使用delete可能会泄漏内存。当在共享值上使用时,它甚至可能在稍后阶段导致程序的分段错误。
https://stackoverflow.com/questions/67227136
复制相似问题