Tk_PathName() 返回的字符串的生命周期是多少?
What is the lifetime of the string returned by Tk_PathName()?
我正在更新一个基于 Tk 的第三方软件以与 Tcl/Tk 8.6 一起使用,并且我有 运行 跨越这种形式的声明:
interp->result = Tk_PathName(tkwin);
,其中 interp
是 Tcl_Interp *
,tkwin
是 Tk_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
是另一个候选者。
我正在更新一个基于 Tk 的第三方软件以与 Tcl/Tk 8.6 一起使用,并且我有 运行 跨越这种形式的声明:
interp->result = Tk_PathName(tkwin);
,其中 interp
是 Tcl_Interp *
,tkwin
是 Tk_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
是另一个候选者。