Python 3.x C API:从PyObject中提取字符串后,是否必须释放内存?

时间:2016-07-11 17:49:33

标签: python c arrays string python-3.x

我使用:

PyObject指针中提取字符串
char* str = PyBytes_AsString(PyUnicode_AsASCIIString(strObj));

我想知道在这样做之后我是否必须释放内存。 The manual似乎没有为这些函数提供有关此内容的任何信息,但其他函数确实提供了使用PyMem_Free()释放内存的信息。

更多详情

毕竟str是指向保留的东西的指针。我会认为这就像std::string::c_str(),其中返回是对象内部的const char*,但Python字符串可以有任何类型的编码,通常不是ASCII。这意味着如果我们转换格式,我们需要保留一些新的空间。

免费或不免费?如果没有,Python如何做到这一点?

1 个答案:

答案 0 :(得分:0)

如果查看PyUnicode_AsASCIIString的文档,您会看到

  

返回值:新参考。
  使用ASCII编码Unicode对象并将结果作为Python字节对象返回。错误处理是“严格的”。如果编解码器引发异常,则返回 NULL

返回的对象是一个常规的Python字节对象,需要经常进行Python引用处理。您收到的参考文献是一个新参考,因此您拥有该参考文献,并且当您完成该参考文献时,您有责任UICollectionViewController。由于您不这样做,您的代码会泄漏此对象。

您还需要处理null返回案例。由于您没有,如果编解码器引发异常,您的代码当前会调用未定义的行为。

如果查看PyBytes_AsString的文档,您会看到

  

返回指向 o 内容的指针。指针指o的内部缓冲区,由Py_DECREF个字节组成。无论是否存在任何其他空字节,缓冲区中的最后一个字节始终为空。除非使用len(o) + 1创建对象,否则不得以任何方式修改数据。它不能被解除分配。如果 o 根本不是字节对象,PyBytes_AsString()将返回 NULL 并引发TypeError。

此函数返回指向bytes对象内部的指针。您不应该释放指针,也不应该修改它指向的数据。您还应该等到PyBytes_FromStringAndSize(NULL, size) Py_DECREF在您正在查看其内部的字节对象之前完成此指针。