我使用:
从PyObject
指针中提取字符串
char* str = PyBytes_AsString(PyUnicode_AsASCIIString(strObj));
我想知道在这样做之后我是否必须释放内存。 The manual似乎没有为这些函数提供有关此内容的任何信息,但其他函数确实提供了使用PyMem_Free()
释放内存的信息。
更多详情
毕竟str
是指向保留的东西的指针。我会认为这就像std::string::c_str()
,其中返回是对象内部的const char*
,但Python字符串可以有任何类型的编码,通常不是ASCII。这意味着如果我们转换格式,我们需要保留一些新的空间。
免费或不免费?如果没有,Python如何做到这一点?
答案 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
在您正在查看其内部的字节对象之前完成此指针。