我有这个C代码:
test.c
#define max_size 9
#define max_value 11
char ** my_function(char my_string[]){
char **my_array = malloc(sizeof(char *) * max_size);
if (!my_array){
return NULL;
}
for( i = 0; i < max_size; i++){
my_array[i] = malloc(sizeof(char)*max_value+1);
if (!my_array[i]) {
free (my_array);
return NULL;
}
}
for( i = 0; i < max_size; i++){
// some code to set my_array[i]
}
return my_array;
}
我正在编译:
gcc -shared -Wl,-soname,libTest.so.1 -o _libTest.dll -fPIC test.c
他们就像我这样导入Python:
test.py
from ctypes import *
from ctypes.util import find_library
libc = CDLL(find_library("c"))
my_lib = CDLL("_libTest.dll")
my_function = my_lib.my_function
my_function.argtypes = [c_char_p]
my_function.restype = POINTER(c_char_p)
my_string = "Hello World"
c_string = c_char_p(my_string)
res = my_function(c_string)
for i in xrange(9):
result = res[i]
# some code using with result
libc.free(result)
libc.free(res)
但是这引发了这个错误:
Traceback (most recent call last):
File "C:/Documents/Python/test.py", line 19, in <module>
libc.free(res)
WindowsError: exception: access violation reading 0x005206CA
正如this answer所述:
您收到的错误表明您的程序正在尝试写入 内存地址XXXXX,但不应该写入该内存 地址。
上面的回答他们使用了一些其他技术,这些技术不涉及任何内存,因此在我的情况下很有用,而且因为我没有尝试在内存中写入,我也是试图释放它。
错误在上面的行libc.free(result)
中没有提升,因此my_array中分配的内存被释放,而不是my_array。
如果我在C中释放它:
for ( i = 0; i < max_size; i ++){
free(res[i]);
}
free(res);
哪种方法是正确的,不会引起任何错误。但这似乎在Python中不起作用。
标题问题:如何从Python(ctypes)的C共享库中释放嵌套的malloc?