【发布时间】:2019-02-08 10:25:10
【问题描述】:
一些 C 代码调用下面的 Rust open 调用,该调用返回一个指针。稍后,C 代码将完全相同的指针传递回close 函数,该函数试图删除(释放)它。它在free(3) 中出现段错误。为什么?
use std::os::raw::{c_int, c_void};
struct Handle;
extern "C" fn open(_readonly: c_int) -> *mut c_void {
let h = Handle;
let h = Box::new(h);
return Box::into_raw(h) as *mut c_void;
}
extern "C" fn close(h: *mut c_void) {
let h = unsafe { Box::from_raw(h) };
// XXX This segfaults - why?
drop(h);
}
【问题讨论】:
-
请使用
rustfmt确保您的代码符合样式指南 -
请注意,这与
extern "C"无关。尽管如此,它还是有段错误play.rust-lang.org/… -
如何让Box不掉线?虽然在示例中我的句柄是空的,但在实际代码中我想返回一个句柄,稍后将其传回给其他函数,然后在关闭时释放。
-
你能举个例子来说明如何调用它吗?
leak似乎返回了内部 T,但这不能转换为最终的void* -
@E4_net_or_something_like_that
Box::into_raw“忘记了”Box,所以Box不会在open返回时被删除。