Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Tk_PathName()返回的字符串的生存期是多少?_C_Tcl_Tk - Fatal编程技术网

C Tk_PathName()返回的字符串的生存期是多少?

C Tk_PathName()返回的字符串的生存期是多少?,c,tcl,tk,C,Tcl,Tk,我正在更新一个基于Tk的第三方软件,以便与Tcl/Tk 8.6一起使用,我遇到了以下表单的声明: interp->result = Tk_PathName(tkwin); ,其中interp是Tcl\u interp*和tkwin是Tk\u窗口。Tcl 8.6中不再允许(默认情况下)直接访问Tcl\u Interp的成员,我想将其转换为调用Tcl\u SetResult(),大致如下: Tcl_SetResult(interp, Tk_PathName(tkwin), /* what g

我正在更新一个基于Tk的第三方软件,以便与Tcl/Tk 8.6一起使用,我遇到了以下表单的声明:

interp->result = Tk_PathName(tkwin);
,其中
interp
Tcl\u interp*
tkwin
Tk\u窗口
。Tcl 8.6中不再允许(默认情况下)直接访问
Tcl\u Interp
的成员,我想将其转换为调用
Tcl\u SetResult()
,大致如下:

Tcl_SetResult(interp, Tk_PathName(tkwin), /* what goes here? */);
但是我很难找到
Tk_PathName()
返回的字符串的生命周期的任何文档,我需要知道这一点才能指定正确的自由函数

我认为正确的做法是将
TCL\u VOLATILE
指定为free函数,以便TCL生成并随后管理自己的字符串副本,但如果调用方负责释放
Tk\u PathName()返回的字符串,则会产生内存泄漏

如果调用方有责任释放,那么我假设应该指定
TCL\u DYNAMIC
,尽管这确实假设(我认为合理)Tk会通过
TCL\u Alloc
分配路径名

那是哪一个呢?或者我还需要别的什么吗?

现在,无论第三个参数是什么,Tcl总是立即将传递的字符串复制到
Tcl\u SetResult()
,以便它可以将该字符串采用到内部使用的托管
Tcl\u Obj
基础结构中
TCL\u VOLATILE
是正确的……只是它不再重要了

有一点是Tcl内部试图支持两种方式;支持它的代码既可怕又怪异,通过检查确实很难确定它是否没有bug,因此我们切换到早期复制,这绝对是正确的语义,而且显然如此。这可能也仅仅意味着拷贝被提前了一小部分,因为Tcl的其他部分没有任何东西可以利用非Tcl_Obj
结果


也就是说,来自
Tk_PathName
的字符串结果的生存期就是小部件的生存期,并且在我使用Tk的时候一直都是这样;该字符串在创建小部件时分配,存储在小部件的内部数据结构中,并在销毁小部件时删除。因此,如果您不打算销毁小部件,
TCL\u STATIC
是另一个候选。我不知道为什么公共API中没有
tknewindowbj()