繁体   English   中英

为什么我不需要释放此内存?

[英]Why do I not need to free this memory?

我正在写一个Python C扩展,在这里列出的示例中,有一段代码:

static PyObject * spam_system(PyObject *self, PyObject *args) {
    const char *command;
    int sts;

    if (!PyArg_ParseTuple(args, "s", &command)) return NULL;
    sts = system(command);
    return Py_BuildValue("i", sts);
}

根据用于使用PyArg_ParseTuple解析字符串的文档,“您不能为字符串本身提供存储;指向现有字符串的指针将存储在您传递地址的字符指针变量中。” 那么Python如何知道何时可以释放“命令”所指向的内存? 如何不发生内存泄漏?

文档说了有关PyArg_ParseTuple的“ s”格式说明PyArg_ParseTuple

s (字符串或Unicode)[const char *]
将Python字符串或Unicode对象转换为指向字符串的C指针。 您一定不能为字符串本身提供存储空间。 指向现有字符串的指针存储在您传递其地址的字符指针变量中。

这意味着指针指向Python本身正在管理的内存。

如果你深入到Python源(我使用的是3.2版),你会发现PyArg_ParseTuplePython/getargs.c 如果跟踪执行情况(如果您已经知道C,那么mark-I眼球就足够了),您将获得convertsimple ,它可以处理一些简单的数据类型格式字符串(例如“ s”)。 然后看看开关的's'分支,您将看到:

char **p = va_arg(*p_va, char **);
/* ... */
*p = PyBytes_AS_STRING(uarg);

稍加PyBytes_AS_STRING将产生PyBytes_AS_STRING的定义:

#define PyBytes_AS_STRING(op) (assert(PyBytes_Check(op)), \
                                (((PyBytesObject *)(op))->ob_sval))

因此,所有这些操作实际上是为您提供了指向Python对象内部字段ob_sval的指针。 Python正在为其内部对象管理内存。

因此,您不应该释放command字符串,因为它最终指向Python的某些内部数据,而Python本身负责该内存。 因此,在文档中出现“放手”警告。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM