Каково время жизни строки, возвращаемой Tk_PathName ()? - PullRequest
1 голос
/ 24 января 2020

Я обновляю часть стороннего программного обеспечения на основе 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.

Так что это? Или мне нужно что-то еще?

1 Ответ

1 голос
/ 25 января 2020

В наши дни Tcl всегда немедленно копирует строку, которую вы передаете в Tcl_SetResult(), независимо от третьего аргумента, чтобы она могла принять строку в управляемый Tcl_Obj инфраструктура, которую он использует внутри. TCL_VOLATILE было бы правильно ... за исключением того, что это просто больше не имеет значения!

Был момент, когда Tcl внутренне пытался поддерживать оба способа ведения дел; код для его поддержки был ужасным и странным, и было действительно трудно убедиться, что в нем нет ошибок, поэтому мы переключились на раннее копирование, которое было абсолютно определенно правильной семантикой и, очевидно, так. Возможно, это так. также означало лишь то, что копия была выдвинута чуть-чуть, так как ничто в остальной части Tcl не могло использовать не-1012 * результаты в тот момент.

Тем не менее, время жизни строкового результата с Tk_PathName - время жизни виджета, и оно всегда было так давно, как я использовал Tk; строка выделяется при создании виджета, сохраняется во внутренней структуре данных виджета и удаляется при уничтожении виджета. Таким образом, TCL_STATIC является еще одним кандидатом, если вы не собираетесь уничтожить виджет.

...