¿Cómo detener las memory leaks al usar `as_ptr ()`?

Ya que es la primera vez que estoy aprendiendo a progtwigr sistemas, me cuesta mucho darme cuenta de las reglas. Ahora, me confundí acerca de las memory leaks. Consideremos un ejemplo. Por ejemplo, Rust está lanzando un puntero (a una cadena) que Python va a atrapar.

En Rust, (solo estoy enviando el puntero del CString )

 use std::ffi::CString; pub extern fn do_something() -> *const c_char { CString::new(some_string).unwrap().as_ptr() } 

En Python, (estoy desreferenciado el puntero)

 def call_rust(): lib = ctypes.cdll.LoadLibrary(rustLib) lib.do_something.restype = ctypes.c_void_p c_pointer = lib.do_something() some_string = ctypes.c_char_p(c_pointer).value 

Ahora, mi pregunta es acerca de liberar la memoria. Pensé que debería ser liberado en Python, pero luego aparece la propiedad. Porque as_ptr parece tener una referencia inmutable. Entonces, me confundí acerca de si debería liberar la memoria en Rust o Python (¿o ambos?) . Si va a ser Rust, entonces, ¿cómo debo liberarlo cuando el flujo de control haya regresado a Python?

    Su función Rust do_something construye un CString temporal, lleva un puntero hacia él y luego suelta el CString . La *const c_char no es válida desde el momento en que la devuelves. Si está CString#into_ptr todas las noches, probablemente desee CString#into_ptr lugar de CString#as_ptr , ya que el primero consume CString sin desasignar la memoria. En estable, puedes mem::forget el CString . Entonces puedes preocuparte por quién debe liberarlo.

    Liberar desde Python será difícil o imposible, ya que Rust puede usar un asignador diferente. El mejor enfoque sería exponer una función Rust que toma un puntero c_char , construye un CString para ese puntero (en lugar de copiar los datos en una nueva asignación), y lo suelta. Desafortunadamente, la parte central (creando el CString ) parece imposible en estable por ahora: CString::from_ptr es inestable.

    Una solución alternativa sería pasar (un puntero a) todo el CString a Python y proporcionar una función de acceso para obtener el puntero de caracteres de la misma. Simplemente debe encajonar el CString y transmutar el cuadro a un puntero en bruto. Luego, puede tener otra función que transmuta el puntero de nuevo a un cuadro y lo deja caer.