如何从Python(ctypes)中的C共享库中释放嵌套的malloc?

时间:2014-12-31 00:48:03

标签: python memory-management malloc ctypes

我有这个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?

0 个答案:

没有答案