首页 > 解决方案 > PyObject* 的“字符串”表示的生命周期

问题描述

我比较了 2 种语言…… C-API 上的TclPython ……与外部 C-API 函数交互……问题在于const char*字符串表示……</p>

Tcl

Tcl_Obj *obj=…;
const char *str=Tcl_GetStringFromObj(obj,NULL);

→ 它是 thestr的一部分,并且与... dito...obj具有相同的生命周期...不需要清理obj

Python

PyObject *obj=…;
PyObject *strObj=PyObject_Str(obj);
const char *str=PyBytes_AsString(strObj);
Py_XDECREF(strObj);

→ 这是需要清理str的一部分...</p> strObjPy_XDECREF(strObj)

python 中的清理是个问题,因为这需要一个奇怪的内务管理……因为str依赖代码逻辑的生命周期

即使我str使用我的 OWN 副本,strstr我也必须清理我的 OWN 副本。

PyObject问题:an和String-Representation的一般生命周期是多少

标签: pythonctcl

解决方案


这是管理对象的字符串表示的两种不同方法。

来自Tcl 文档Tcl_GetStringFromObj

返回的字节指针所引用的存储空间归对象管理器所有。

来自Python 文档PyObject_Str

返回值:新引用。计算对象 o 的字符串表示。

因此 Python 决定每次请求对象时都计算对象的字符串表示形式,并且调用与调用PyObject_Str基本相同Tcl_NewStringObj。这确实需要开发人员对返回的对象进行一些内存管理,但另一方面,这意味着您不必担心每次更改对象时管理对象的内部字符串表示:字符串只是简单地计算每次被要求。


推荐阅读