正在删除从 Tcl_NewListObj 返回的 tcl 列表
Deleting tcl list returned from Tcl_NewListObj
我使用这个函数创建了一个 tcl 列表 Tcl_NewListObj
,如果我没有使用这个 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?
清理不再需要的(对 a 的引用)Tcl_Obj 的正确方法是通过 Tcl_DecrRefCount
。你的情况:
Tcl_DecrRefCount(listPtr);
使用 delete
在最佳情况下可能会泄漏内存。当用于共享值时,它甚至可能在稍后阶段导致程序出现段错误。
使用Tcl_IncrRefCount()
和Tcl_DecrRefCount()
来管理对象的引用计数;当引用计数减少到小于 1 时,它将被正确处理。(它 从零开始; 立即 Tcl_DecrRefCount()
会破坏列表。实际删除函数是 TclFreeObj()
,但 从不 直接调用它。Tcl_DecrRefCount()
会在适当的时候调用它。)
不要delete
对象!那是行不通的。
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);
请注意,如果您决定 return 列表作为 Tcl 结果而不是处理它,您可以这样做:
Tcl_SetObjResult(interp, listPtr);
无需手动管理引用计数。这就是引用计数从零开始的原因。 (尝试使用 1 的初始引用计数,但发现没有任何优势,同时大大增加了代码官僚主义的数量。)
我使用这个函数创建了一个 tcl 列表 Tcl_NewListObj
,如果我没有使用这个 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?
清理不再需要的(对 a 的引用)Tcl_Obj 的正确方法是通过 Tcl_DecrRefCount
。你的情况:
Tcl_DecrRefCount(listPtr);
使用 delete
在最佳情况下可能会泄漏内存。当用于共享值时,它甚至可能在稍后阶段导致程序出现段错误。
使用Tcl_IncrRefCount()
和Tcl_DecrRefCount()
来管理对象的引用计数;当引用计数减少到小于 1 时,它将被正确处理。(它 从零开始; 立即 Tcl_DecrRefCount()
会破坏列表。实际删除函数是 TclFreeObj()
,但 从不 直接调用它。Tcl_DecrRefCount()
会在适当的时候调用它。)
不要delete
对象!那是行不通的。
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);
请注意,如果您决定 return 列表作为 Tcl 结果而不是处理它,您可以这样做:
Tcl_SetObjResult(interp, listPtr);
无需手动管理引用计数。这就是引用计数从零开始的原因。 (尝试使用 1 的初始引用计数,但发现没有任何优势,同时大大增加了代码官僚主义的数量。)