首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除从Tcl_NewListObj返回的tcl列表

删除从Tcl_NewListObj返回的tcl列表
EN

Stack Overflow用户
提问于 2021-04-23 09:10:38
回答 2查看 104关注 0票数 0

我使用这个函数Tcl_NewListObj创建了一个tcl列表,如果我没有使用这个tcl列表,我如何进行清理?应该在下面的代码中调用listPtr上的delete吗?

代码语言:javascript
复制
    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?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-23 14:12:20

使用Tcl_IncrRefCount()Tcl_DecrRefCount()来管理对象的引用计数;当引用计数降到小于1的值时,它将被正确地释放。(从零开始;立即Tcl_DecrRefCount()将销毁列表。实际的删除函数是TclFreeObj(),但从不直接调用它。Tcl_DecrRefCount()会在适当的时候调用它。)

delete,,,,the object!,无法工作的对象。

Tcl在很多方面都使用每线程内存,特别是Tcl_Obj结构(它也有其他优化),它极大地加快了系统的速度,但也意味着您必须通过Tcl的API分配和释放。

简而言之,这样做:

代码语言:javascript
复制
Tcl_Obj* listPtr = Tcl_NewListObj(0,NULL); 

// some code where we decide we don't want to use listPtr
Tcl_DecrRefCount(listPtr);

请注意,如果您决定将列表作为Tcl结果返回,而不是将其处理,则只需这样做:

代码语言:javascript
复制
Tcl_SetObjResult(interp, listPtr);

不需要手动管理引用计数。这就是为什么参考计数从零开始。(尝试使用1的初始引用计数,但发现在大大增加代码官僚性的同时,没有提供任何优势。)

票数 1
EN

Stack Overflow用户

发布于 2021-04-23 09:43:58

清除不再需要的(引用) Tcl_Obj的正确方法是通过Tcl_DecrRefCount。就你而言:

代码语言:javascript
复制
Tcl_DecrRefCount(listPtr);

在最好的情况下,使用delete可能会泄漏内存。当在共享值上使用时,它甚至可能在稍后阶段导致程序的分段错误。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67227136

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档