Wie beende ich Speicherverluste, wenn ich as_ptr () verwende?
Da ich zum ersten Mal Systemprogrammierung lerne, fällt es mir schwer, mich mit den Regeln zu beschäftigen. Jetzt wurde ich über Speicherlecks verwirrt. Betrachten wir ein Beispiel. Sagen wir mal, Rust wirft einen Zeiger (auf einen String), den Python fangen wird.
In Rust, (Ich sende nur den Zeiger desCString
)
use std::ffi::CString;
pub extern fn do_something() -> *const c_char {
CString::new(some_string).unwrap().as_ptr()
}
In Python, (ich dereferenziere den Zeiger)
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
Now, meine Frage bezieht sich auf die Freigabe des Speichers. Ich dachte, es sollte in Python freigegeben werden, aber dann taucht der Besitz auf. Weil,as_ptr
scheint einen unveränderlichen Bezug zu haben. Also war ich verwirrt, ob ich den Speicher in Rust oder Python @ freigeben sollt(oder beides?. Wenn es Rust sein soll, wie soll ich es dann freigeben, wenn der Kontrollfluss wieder in Python gelandet ist?