refCount,Tcl_是共享的(项[0]); Tcl_递减计数(项目[0]); printf(“\tref%i,sh%i\n”,项[0]->refCount,Tcl_是共享的(项[0]); Tcl_ListObjAppendElement(interp、resultPtr、itemFormatted); } Tcl_SetObjResult(interp,resultPtr); 返回TCL_OK; },c++,tcl,C++,Tcl" /> refCount,Tcl_是共享的(项[0]); Tcl_递减计数(项目[0]); printf(“\tref%i,sh%i\n”,项[0]->refCount,Tcl_是共享的(项[0]); Tcl_ListObjAppendElement(interp、resultPtr、itemFormatted); } Tcl_SetObjResult(interp,resultPtr); 返回TCL_OK; },c++,tcl,C++,Tcl" />

Tcl_格式内存使用情况 这是一个用C(++)编写的TCL的扩展过程(C++是无关紧要的,我只使用 STD::向量< /代码>)。 我使用Tcl_Format创建一个新的格式化字符串。如果不使用Tcl\u decrefcount,每次调用此外部进程时,Xcode都会报告使用的内存越来越多: int TclME::vTestExt(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj* const objv[]) { Tcl_Obj *resultPtr, *item[1], *itemFormatted; size_t N; std::vector<long> v; populate_v(v); N = v.size(); resultPtr = Tcl_NewListObj(0, NULL); for (long i = 0; i < N; ++i) { item[0] = Tcl_NewLongObj(v[i]); printf("item[0] ref %i, sh %i; ", item[0]->refCount, Tcl_IsShared(item[0])); itemFormatted = Tcl_Format(interp, "#%06X", 1, item); // With Tcl_DecrRefCount commented out, there is a memory leak printf("\tref %i, sh %i; ", item[0]->refCount, Tcl_IsShared(item[0])); Tcl_DecrRefCount(item[0]); printf("\tref %i, sh %i\n", item[0]->refCount, Tcl_IsShared(item[0])); Tcl_ListObjAppendElement(interp, resultPtr, itemFormatted); } Tcl_SetObjResult(interp, resultPtr); return TCL_OK; } int-TclME::vTestExt(ClientData-ClientData、Tcl_-Interp*Interp、int-objc、Tcl_-Obj*const-objv[] { Tcl_Obj*resultPtr,*项[1],*项格式化; 尺寸; std::向量v; 填充v(v); N=v.大小(); resultPtr=Tcl_NewListObj(0,NULL); 用于(长i=0;irefCount,Tcl_是共享的(项目[0]); itemFormatted=Tcl_格式(interp,#%06X),1,项); //注释掉Tcl_decrefcount后,内存泄漏 printf(“\tref%i,sh%i;”,项[0]->refCount,Tcl_是共享的(项[0]); Tcl_递减计数(项目[0]); printf(“\tref%i,sh%i\n”,项[0]->refCount,Tcl_是共享的(项[0]); Tcl_ListObjAppendElement(interp、resultPtr、itemFormatted); } Tcl_SetObjResult(interp,resultPtr); 返回TCL_OK; }

Tcl_格式内存使用情况 这是一个用C(++)编写的TCL的扩展过程(C++是无关紧要的,我只使用 STD::向量< /代码>)。 我使用Tcl_Format创建一个新的格式化字符串。如果不使用Tcl\u decrefcount,每次调用此外部进程时,Xcode都会报告使用的内存越来越多: int TclME::vTestExt(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj* const objv[]) { Tcl_Obj *resultPtr, *item[1], *itemFormatted; size_t N; std::vector<long> v; populate_v(v); N = v.size(); resultPtr = Tcl_NewListObj(0, NULL); for (long i = 0; i < N; ++i) { item[0] = Tcl_NewLongObj(v[i]); printf("item[0] ref %i, sh %i; ", item[0]->refCount, Tcl_IsShared(item[0])); itemFormatted = Tcl_Format(interp, "#%06X", 1, item); // With Tcl_DecrRefCount commented out, there is a memory leak printf("\tref %i, sh %i; ", item[0]->refCount, Tcl_IsShared(item[0])); Tcl_DecrRefCount(item[0]); printf("\tref %i, sh %i\n", item[0]->refCount, Tcl_IsShared(item[0])); Tcl_ListObjAppendElement(interp, resultPtr, itemFormatted); } Tcl_SetObjResult(interp, resultPtr); return TCL_OK; } int-TclME::vTestExt(ClientData-ClientData、Tcl_-Interp*Interp、int-objc、Tcl_-Obj*const-objv[] { Tcl_Obj*resultPtr,*项[1],*项格式化; 尺寸; std::向量v; 填充v(v); N=v.大小(); resultPtr=Tcl_NewListObj(0,NULL); 用于(长i=0;irefCount,Tcl_是共享的(项目[0]); itemFormatted=Tcl_格式(interp,#%06X),1,项); //注释掉Tcl_decrefcount后,内存泄漏 printf(“\tref%i,sh%i;”,项[0]->refCount,Tcl_是共享的(项[0]); Tcl_递减计数(项目[0]); printf(“\tref%i,sh%i\n”,项[0]->refCount,Tcl_是共享的(项[0]); Tcl_ListObjAppendElement(interp、resultPtr、itemFormatted); } Tcl_SetObjResult(interp,resultPtr); 返回TCL_OK; },c++,tcl,C++,Tcl,void populate\u v(std::vector&v)设置向量项 输出为项目[0]参考0,sh 0;参考文献0,sh 0;ref-1,sh0,因此我不希望手动调用Tcl\u decrefcount 我遗漏了什么?创建新的TCL对象时,其引用计数为0 当引用计数器降至0时,将释放任何TCL对象。因此,干净的方法是在创建对象后首先递增引用计数器,然后在不再使用时再次递减(例如,在调用Tcl_Format()之后) 在上面的特殊情况下,您可以使用Tcl\u ObjPrintf()绕过此问题:

void populate\u v(std::vector&v)
设置向量项

输出为<代码>项目[0]参考0,sh 0;参考文献0,sh 0;ref-1,sh0,因此我不希望手动调用
Tcl\u decrefcount


我遗漏了什么?

创建新的TCL对象时,其引用计数为0

当引用计数器降至0时,将释放任何TCL对象。因此,干净的方法是在创建对象后首先递增引用计数器,然后在不再使用时再次递减(例如,在调用
Tcl_Format()
之后)

在上面的特殊情况下,您可以使用
Tcl\u ObjPrintf()
绕过此问题:

。。。
用于(长i=0;i
希望我能给2+,用于
Tcl_ObjPrintf
和解释下降位。产生这种事情过去很烦人;这就是为什么添加了
Tcl_ObjPrintf
...
for (long i = 0; i < N; ++i) {
    Tcl_ListObjAppendElement(interp, resultPtr, Tcl_ObjPrintf("#%06X", v[i]));
}
...