Как я могу создать буфер, который Python не освободил бы? - PullRequest
2 голосов
/ 27 июня 2011

Мне нужно вызвать функцию из библиотеки C из Python, которая освободит () параметр.Поэтому я попытался создать create_string_buffer (), но кажется, что этот буфер будет освобожден Python позже, и это сделает буфер освобожденным дважды.

Я читал в Интернете, что Python пересчитает буферы, иосвободить их, когда нет ссылки.Итак, как я могу создать буфер, который питон не будет заботиться об этом впоследствии?Спасибо.

пример: я загружаю dll с: lib = cdll.LoadLibrary("libxxx.so"), а затем вызываю функцию с: path = create_string_buffer(topdir) и lib.load(path).Однако функция загрузки в libxxx.so освобождает свой аргумент.И позже Python будет освобожден Python, поэтому он освобождается дважды

1 Ответ

3 голосов
/ 27 июня 2011

Попробуйте следующее в указанном порядке:

  1. Попробуйте всеми средствами управлять памятью в Python, например, используя create_string_buffer(). Если вы можете контролировать поведение функции C, измените ее, чтобы не free() буфер.

  2. Если библиотечная функция, которую вы вызываете, освобождает буфер после его использования, должна быть какая-то библиотечная функция, которая выделяет буфер (или библиотека повреждена).

  3. Конечно, вы можете позвонить malloc() через ctypes, но это нарушит все хорошие методы управления памятью. Используйте это как последнее средство. Почти наверняка это приведет к трудностям в обнаружении ошибок в более позднее время.

...