Проблемы управления памятью с CFFI (память высвобождается слишком рано) - PullRequest
0 голосов
/ 14 января 2020

Я пишу оболочку Python для программы C. Намерение состоит в том, чтобы установить набор глобальных переменных в Python, передать их в C через CFFI (код C использует много глобальных переменных), изменить эти глобальные переменные в коде C и затем подобрать результаты в коде Python для дальнейшей обработки.

Примеры того, как я устанавливаю массив данных и строковую переменную для передачи на стороне Python в функции оболочки:

    import numpy as np
    import ctypes

    myarray = np.zeros((100), dtype=np.float64)
    p_myarray = myarray.ctypes.data
    lib.myarray = ffi.cast("double *", p_myarray)

    sd = {} # Dictionary to try to save the variables in memory
    mystring = 'Dragonfruit'.encode('ascii')
    lib.mystring = sd[mystring] = ffi.new("char[20]", mystring)

    lib.test() # Call to C code

    print(sd) # Try to force Python to keep the strings allocated until this point at least

И сборка CFFI:

...
ffibuilder.cdef("""
    extern double *myarray;
    extern char *mystring;
    int test(void);

Есть две проблемы, возможно связанные:

  1. Код C большой, он выдает и записывает в локальных массивах. В некоторых случаях строки, переданные с Python, перезаписываются. Добавление их в словарь Python и использование его после кода C, по-видимому, делает их более стабильными (т. Е. Они превращают его в код C в порядке, но не всегда из него).

  2. Если мне повезет и я получу его достаточно стабильным, чтобы вернуться к коду Python без дампа памяти из-за перезаписи моих переменных, я получу

Python: free(): invalid next size (fast) 

ошибка, которая из других постов здесь, кажется, означает, что некоторая память пытается освободиться, которая уже была освобождена.

Я подозреваю, что Python освобождает мои переменные слишком рано (т.е. до C код), кто-нибудь знает, как это предотвратить?

...