我正在使用 ctypes 将一些 C 函数从 DLL 公开到 Python 脚本。其中一个函数返回一个动态大小的字符数组,我希望能够在 Python 中读取该数组的内容,还希望在我完成后释放数组内存的属性句柄。
示例 C 代码:
...
#ifdef __cplusplus
extern "C"
{
#endif
__declspec(dllexport) char * WINAPI get_str()
{
int str_len = ... // figure out how long it is gonna be and set it here
char *ary = (char *)malloc(sizeof(char) * str_len);
// populate the array
...
ary[str_len - 1] = '\0';
return ary;
}
#ifdef __cplusplus
}
#endif
我构建了我的 DLL,将其复制到可以找到的位置,然后使用以下 Python 代码:
import ctypes
my_dll = ctypes.WinDLL("MyDLLName.dll")
some_str = ctypes.string_at(my_dll.get_str())
print some_str
这段代码一切正常,正如您所期望的那样。我的问题是:因为 ctypes.string_at 在指定的内存位置创建一个字符串,当 some_str 在 Python 解释器中超出范围时,该内存会被垃圾收集,还是我需要手动释放它?