tcl_format内存使用情况

Tcl_Format memory usage

本文关键字:用情 情况 内存 format tcl      更新时间:2023-10-16

这是用C( )编写的TCL的扩展Proc(C 在这里无关紧要 - 我只使用std::vector)。我使用Tcl_Format创建一个新的格式字符串。如果我不使用Tcl_DecrRefCount,则每次将其称为外部Proc时,都会使用越来越多的内存报告:

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 %in", item[0]->refCount, Tcl_IsShared(item[0]));
        Tcl_ListObjAppendElement(interp, resultPtr, itemFormatted);
    }
    Tcl_SetObjResult(interp, resultPtr);
    return TCL_OK;
}

void populate_v(std::vector<long> &v)设置向量项目。

输出是item[0] ref 0, sh 0; ref 0, sh 0; ref -1, sh 0,所以我不必指望手动致电Tcl_DecrRefCount

我想念什么?

创建一个新的tcl对象时,其参考count 为0。

当参考计数器下降到 0时,任何TCL对象都将被释放。然后降低在不再使用时再次(例如,在拨打Tcl_Format()之后)。

在上面的特殊情况下,您可以使用Tcl_ObjPrintf()

来避免此问题
...
for (long i = 0; i < N; ++i) {
    Tcl_ListObjAppendElement(interp, resultPtr, Tcl_ObjPrintf("#%06X", v[i]));
}
...
相关文章: