Tcl_Obj*消耗了多少内存,我需要删除它吗?

Tcl_Obj*消耗了多少内存,我需要删除它吗?,tcl,Tcl,我有这部分代码,它被称为数千时间和高内存消耗,所以我无法决定是否需要删除这个tcl对象指针 ATcl_Obj指向32位系统上24字节长的内存块(我没有在64位系统上测量过,但它可能最多48字节,具体取决于编译器如何打包结构)。它还可以指向更多大小可变的内存;在64位系统上,千兆字节是最有可能的。特别是,值的字符串表示可以挂起,列表或字典表示等其他内容也可以挂起。(封面下的细节变化很大。) 因此,是的,一旦不再需要,它们应该被正确地释放!虽然您不需要在Tcl语言级别执行此操作(除了偶尔对全局变量使

我有这部分代码,它被称为数千时间和高内存消耗,所以我无法决定是否需要删除这个tcl对象指针

A
Tcl_Obj
指向32位系统上24字节长的内存块(我没有在64位系统上测量过,但它可能最多48字节,具体取决于编译器如何打包结构)。它还可以指向更多大小可变的内存;在64位系统上,千兆字节是最有可能的。特别是,值的字符串表示可以挂起,列表或字典表示等其他内容也可以挂起。(封面下的细节变化很大。)

因此,是的,一旦不再需要,它们应该被正确地释放!虽然您不需要在Tcl语言级别执行此操作(除了偶尔对全局变量使用
unset
),但在Tcl C API级别正确执行引用计数管理是至关重要的


对于您正在使用的特定代码,在调用
Tcl\u EvalObjEx
之前和调用之后,您需要同时执行
Tcl\u IncrRefCount(cmdobj)
。既然你使用C++,辅助助手RAII类可能会使这更容易。

或者您可以使用
Tcl\u GlobalEval
,它现在只是一个包装器,围绕着相同的底层基本功能,但为您提供Tcl\u Obj内存管理

std::string cmd = get_itcl_obj_name() + " set_ude_jobname " + name;
Tcl_Obj* cmdobj = Tcl_NewStringObj(cmd.c_str(),-1 );
if(Tcl_EvalObjEx(interp, cmdobj, TCL_EVAL_GLOBAL) == TCL_OK)
{
    return true;
}
else
{
    return false;
}
(虽然存在一些细微的性能差异,但它们实际上并不重要。或者,如果它们真的存在,我们建议进行更实质性的重写以使用
Tcl_EvalObjv
,但这是一个更大的变化。要么这样做,要么对Tcl_Obj进行一些缓存,以便Tcl可以有效地挂起后端的字节码编译。所有这些都是q你需要做比你想象中更大的改变!)

std::string cmd = get_itcl_obj_name() + " set_ude_jobname " + name;
if (Tcl_GlobalEval(interp, cmd.c_str()) == TCL_OK) {
    return true;
} else {
    return false;
}