我比较2种语言...在C-API上的 Tcl 和 Python ...与外部C-API函数交互...问题是const char*
字符串-代表...
Tcl_Obj *obj=…;
const char *str=Tcl_GetStringFromObj(obj,NULL);
→str
是obj
的一部分,并且与obj
的生存期相同……dito…不需要清理
PyObject *obj=…;
PyObject *strObj=PyObject_Str(obj);
const char *str=PyBytes_AsString(strObj);
Py_XDECREF(strObj);
→str
是strObj
的一部分,需要清理Py_XDECREF(strObj)
…
用python清理是个问题,因为这需要古怪整理…因为str
的生命周期取决于代码逻辑
即使我使用str
做自己的OWN strstr
副本,也必须清理我的OWN副本。
问题:PyObject
和字符串表示形式
答案 0 :(得分:1)
这是管理对象的字符串表示形式的两种不同方法。
来自Tcl docs for Tcl_GetStringFromObj
:
由返回的字节指针引用的存储空间由 对象管理器。
来自Python docs for PyObject_Str
:
返回值:新参考。计算对象的字符串表示形式 o。
因此,Python决定每次请求对象时就计算对象的字符串表示形式,并且调用PyObject_Str
与调用Tcl_NewStringObj
基本相同。这确实需要开发人员对返回的对象进行一些内存管理,但另一方面,这意味着您不必担心每次更改对象时都管理对象的内部字符串表示形式:只需计算字符串每次被请求。