Vì đây là lần đầu tiên tôi lập trình hệ thống học tập, tôi đang gặp khó khăn trong việc bao quanh đầu các quy tắc. Bây giờ, tôi đã nhầm lẫn về rò rỉ bộ nhớ. Hãy xem xét một ví dụ. Nói, Rust đang ném một con trỏ (đến một chuỗi) mà Python sẽ bắt được.Làm thế nào để ngăn chặn rò rỉ bộ nhớ khi sử dụng `as_ptr()`?
Trong Rust, (tôi chỉ gửi con trỏ của CString
)
use std::ffi::CString;
pub extern fn do_something() -> *const c_char {
CString::new(some_string).unwrap().as_ptr()
}
Trong Python, (tôi dereferencing con trỏ)
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
Bây giờ, câu hỏi của tôi là về giải phóng bộ nhớ. Tôi nghĩ rằng nó nên được giải phóng bằng Python, nhưng sau đó quyền sở hữu bật lên. Bởi vì, as_ptr
dường như có một tham chiếu bất biến. Vì vậy, tôi đã nhầm lẫn về việc liệu tôi có nên giải phóng bộ nhớ trong Rust hoặc Python (hoặc cả hai?). Nếu nó sẽ là Rust, thì làm thế nào tôi nên giải phóng nó khi dòng điều khiển đã hạ cánh trở lại Python?
Lưu ý rằng trong trường hợp này, không có ** rò rỉ bộ nhớ **. Thay vào đó, nó là một lỗi sử dụng sau khi miễn phí, mà thường là nhiều hơn nữa phá hoại. – Shepmaster