正在删除从 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 的初始引用计数,但发现没有任何优势,同时大大增加了代码官僚主义的数量。)