2016-03-31 3 views
1

У меня есть ctypes - библиотека, которая обертывает C-библиотеку, которая иногда выделяет память, которая должна быть освобождена. В Linux это легко, потому что общие функции glibc связаны с этой библиотекой C, и я могу просто позвонить free(). Тем не менее, похоже, что такая же функциональность недоступна, когда я обращаюсь к этой сборке сторонних разработчиков под Windows.Освобождение памяти, выделенной с помощью ctypes в Python

ctypes.util.find_msvcrt() кажется многообещающим, но он возвращает Отсутствует, хотя я бегу под Windows. Я не уверен, что это означает, что исходная DLL была построена с помощью чего-то другого, кроме инструментальной цепочки Microsoft.

Итак, у меня осталось память, чтобы освободиться, и нет очевидного, простого способа сделать это. У кого-нибудь есть идеи?

+1

Связаться с третьей стороной, и сказать им, чтобы исправить их сломанную API. –

ответ

4

При использовании MSVCRT вам необходимо убедиться, что вы используете жеfree/malloc пар из того же ЭЛТ (возможно, чтобы ваша программа работает с несколькими ЭЛТ). Библиотека, с которой вы работаете, кажется разбитой - библиотека должна иметь оболочку free, которая вызывает правильную версию free.

Другими словами, даже если вам удалось найти какой-то MSVCRT free, нет никакой гарантии, что это тот, который вы хотите.

Смотрите также http://siomsystems.com/mixing-visual-studio-versions/

+0

См. Также: http://siomsystems.com/mixing-visual-studio-versions/ –

+0

Поместите эту ссылку прямо в свой ответ. –

+0

Библиотека также позволяет пользователю определить используемый распределитель. Например, посмотрите, как [пользовательские распределители памяти] (https://docs.python.org/3/c-api/memory.html#customize-memory-allocators) реализованы в CPython. Затем через ctypes вы можете использовать библиотеку интерфейса [raw memory interface] CPython (https://docs.python.org/3/c-api/memory.html#raw-memory-interface). – eryksun

Смежные вопросы