如何让变量拥有'static生命周期以适配vulkano的CPUAccessibleBuffer?
Vulkano CPUAccessibleBuffer from_data 'static生命周期报错解决方案
CPUAccessibleBuffer::from_data函数要求传入参数具备'static生命周期,本质是要求传入的数据不存在短期的外部借用依赖,避免buffer持有悬垂引用。运行时生成的&[u8]是临时借用,默认生命周期短于'static,因此编译报错。
解决方案1:传入持有所有权的Vec<u8>(最推荐)
不要传入借用的切片,将运行时生成的&[u8]拷贝为拥有所有权的Vec<u8>后再传入函数,无内存泄漏风险,符合Rust所有权规范。
示例代码:
// 假设runtime_data是运行时生成的&[u8] let owned_data: Vec<u8> = runtime_data.to_vec(); let buffer = CpuAccessibleBuffer::from_data( &device, BufferUsage::all(), false, owned_data ).expect("Failed to create buffer");
解决方案2:将数据泄漏为'static切片(仅特殊场景使用)
如果必须传入切片类型,可以通过Box::leak将堆上的数据生命周期延长为'static,注意该方法会主动放弃Rust的内存自动回收机制,造成内存泄漏,仅适合buffer生命周期与程序运行周期一致、无需释放对应内存的场景。
示例代码:
let static_data: &'static [u8] = Box::leak(runtime_data.to_vec().into_boxed_slice()); let buffer = CpuAccessibleBuffer::from_data( &device, BufferUsage::all(), false, static_data ).expect("Failed to create buffer");
内容的提问来源于stack exchange,提问作者little_monkey
相关产品推荐
相关产品推荐

