Структура копирования Python ctypes, расположенная во временном буфереPython

Программы на Python
Anonymous
Структура копирования Python ctypes, расположенная во временном буфере

Сообщение Anonymous »


У меня есть код, который выглядит следующим образом:

из импорта ctypes * импортировать некоторую_библиотеку класс Вещь(Структура): _поля_ = [ ("А", c_uint8*4), («Б», Группа*4)] pointer_to_thing = POINTER(вещь)() защита get_thing(): some_library.allocate_memory_for_thing() some_library.read_thing() pointer_to_thing = some_library.give_me_the_thing() вещь = указатель_на_вещь.содержание some_library.release_memory() вернуть вещь вещь = получить_вещь() что не удается, потому что some_library.give_me_the_thing() дает мне ссылку на эту вещь, а some_library.release_memory() освобождает память, в которой находится эта вещь. Если я прокомментирую some_library.release_memory(), это сработает, но это должно быть сделано не так. Я должен освободить память перед возвратом из функции, поэтому я хотел бы сделать копию объекта и вернуть эту копию, вот так:

def get_thing(): some_library.allocate_memory_for_thing() some_library.read_thing() pointer_to_thing = some_library.give_me_the_thing() вещь = указатель_на_вещь.содержание копия_вещи = Вещь() мемпереместить( адрес(копия_вещи), адрес(вещи), размер(Вещь), ) some_library.release_memory() вернуть копию_вещи Однако он всегда возвращает Thing с неправильными данными. Если some_library.release_memory() прокомментирован, то все работает как положено. Как будто он вообще не копирует содержимое...

Я тоже пробовал

def get_thing(): some_library.allocate_memory_for_thing() some_library.read_thing() pointer_to_thing = some_library.give_me_the_thing() вещь = указатель_на_вещь.содержание copy_of_thing = Thing.copy_from_buffer(вещь) some_library.release_memory() вернуть копию_вещи и поведение точно такое же, т. е. если я освобождаю память, происходит сбой, если нет, то работает.

К сожалению, some_library — сложная вещь, и мне не так-то просто создать MWE для публикации здесь.

Вернуться в «Python»