【发布时间】:2022-12-06 21:24:25
【问题描述】:
我正在编写一些 C FFI 绑定,但我遇到了一种情况,我不确定它是否有效。以最简单的形式,它将是:
unsafe fn foo() -> (*const u8, Vec<u8>) {
let buf = vec![0, 1, 2];
(buf.as_ptr(), buf)
}
现在使用它:
fn main() {
let (ptr, _buf) = foo();
// pass ptr to C function...
}
在上面的示例中,ptr 是否有效,因为 _buf 一直存在到范围结束?
【问题讨论】:
-
请注意,如果您将
Vec替换为Box,那么 Miri 会抱怨(请参阅我的回答)。 -
@ChayimFriedman 如果我们使用
Pin<Box>会怎么样? -
Pin根本没有改变别名规则。如果有的话,它是Unpin,这只是一个临时的 hack。
标签: pointers rust lifetime unsafe