gpt4 book ai didi

python - 使用 `as_ptr()` 时如何阻止内存泄漏?

转载 作者:太空狗 更新时间:2023-10-29 20:58:33 25 4
gpt4 key购买 nike

由于这是我第一次学习系统编程,所以我很难理解这些规则。现在,我对内存泄漏感到困惑。让我们考虑一个例子。假设,Rust 正在抛出一个指针(指向一个字符串),Python 将捕获该指针。

在 Rust 中,(我只是发送 CString 的指针)

use std::ffi::CString;

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

在 Python 中,(我取消引用指针)

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

现在,我的问题是关于释放内存。我认为它应该在 Python 中被释放,但所有权突然出现。因为,as_ptr似乎采用了不可变的引用。所以,我对是否应该释放 Rust 或 Python 中的内存感到困惑(或两者?)。如果它是 Rust,那么当控制流回到 Python 时,我应该如何释放它?

最佳答案

您的 Rust 函数 do_something 构造一个临时的 CString,将一个指针放入其中,然后删除 CString*const c_char 从您返回它的那一刻起就无效了。如果你在夜间,你可能想要 CString#into_ptr 而不是 CString#as_ptr,因为前者消耗 CString 而不释放内存.在稳定版中,您可以mem::forget CString。然后你可以担心谁应该释放它。

从 Python 中释放将是棘手的或不可能的,因为 Rust 可能使用不同的分配器。最好的方法是公开一个 Rust 函数,它接受一个 c_char 指针,为该指针构造一个 CString(而不是将数据复制到一个新的分配中),然后删除它。不幸的是,中间部分(创建 CString)目前似乎不可能稳定:CString::from_ptr 不稳定。

解决方法是将整个 CString 传递(指向)到 Python,并提供访问器函数以从中获取 char 指针。您只需将 CString 装箱并将该箱子转换为原始指针。然后你可以有另一个函数将指针转换回一个盒子并让它掉落。

关于python - 使用 `as_ptr()` 时如何阻止内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31083223/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com