Dato che è la prima volta che imparo programmi di programmazione, sto attraversando un periodo difficile che mi avvolge le regole. Ora, mi sono confuso su perdite di memoria. Consideriamo un esempio. Dì, Rust sta lanciando un puntatore (a una corda) che Python prenderà.Come fermare la perdita di memoria quando si usa `as_ptr()`?
A Rust, (io sono solo l'invio del puntatore del CString
)
use std::ffi::CString;
pub extern fn do_something() -> *const c_char {
CString::new(some_string).unwrap().as_ptr()
}
In Python, (sto dereferenziazione il puntatore)
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
Ora, la mia domanda è di circa liberare la memoria. Ho pensato che dovrebbe essere liberato in Python, ma poi la proprietà si apre. Perché, as_ptr
sembra prendere un riferimento immutabile. Quindi, mi sono confuso se avrei dovuto liberare la memoria in Rust o Python (o entrambi?). Se sarà Rust, come dovrei liberare quando il flusso di controllo è tornato in Python?
Si noti che in questo caso, ** c'è ** perdita di memoria. Invece, si tratta di un errore use-after-free, che di solito è molto più distruttivo. – Shepmaster