Tk_PathName() 返回的字符串的生命周期是多少?

What is the lifetime of the string returned by Tk_PathName()?

我正在更新一个基于 Tk 的第三方软件以与 Tcl/Tk 8.6 一起使用,并且我有 运行 跨越这种形式的声明:

interp->result = Tk_PathName(tkwin);

,其中 interpTcl_Interp *tkwinTk_Window。在 Tcl 8.6 中不再允许(默认情况下)直接访问 Tcl_Interp 的成员,我想将其转换为对 Tcl_SetResult() 的调用,如下所示:

Tcl_SetResult(interp, Tk_PathName(tkwin), /* what goes here? */);

但我无法找到任何有关 Tk_PathName() 返回的字符串的生命周期的文档,我需要知道它才能指定正确的自由函数。

我怀疑正确的做法是将 TCL_VOLATILE 指定为自由函数,以便 Tcl 创建并随后管理它自己的字符串副本,但是如果调用者负责释放 Tk_PathName().

返回的字符串

如果调用者有责任释放,那么我想应该指定 TCL_DYNAMIC,尽管这确实假设(我认为合理)Tk 会通过 Tcl_Alloc 分配路径名。

那是哪一个?或者我需要其他东西吗?

如今,Tcl 总是 立即将您传递的字符串复制到 Tcl_SetResult(),而不管第三个参数,所以它可以将字符串采用到它内部使用的托管 Tcl_Obj 基础设施中。 TCL_VOLATILE 是对的……只是它不再重要了!

有一点 Tcl 在内部试图支持两种做事方式;支持它的代码既可怕又怪异,通过检查确实很难确定它没有错误,所以我们切换到早期副本,绝对正确的语义,显然如此。 这可能也只是意味着副本被提前了一点点,因为此时 Tcl 的其余部分中没有任何东西可以使用非 Tcl_Obj 结果。

就是说,Tk_PathName 产生的字符串的生命周期就是小部件的生命周期,而且从我使用 Tk 开始就一直如此;该字符串在创建小部件时分配,存储在小部件的内部数据结构中,并在销毁小部件时删除。因此,如果您不打算销毁小部件,TCL_STATIC 是另一个候选者。