我正在写一些CFFI绑定,我遇到了一个我不确定它是否有效的情况,最简单的形式是:
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
一直存在到作用域结束。
1条答案
按热度按时间kknvjkwl1#
问题是移动
Vec
是否会使指向它的指针失效,答案是,还没有决定。这是UCG issue #326。
所以最好在决定之前避免这样的代码,但是不管怎样,因为很多代码依赖于这样的代码来工作,我不相信它会被决定为无效。