Rust 使用带锈的刮板板条箱进行寿命管理

Rust 使用带锈的刮板板条箱进行寿命管理,rust,allocation,lifetime,scratchpad,Rust,Allocation,Lifetime,Scratchpad,从概念上讲,我们希望创建多个内存池,每个池单独充当一个堆栈。 在每个堆栈中,我们分配不同大小的对象,并以类似堆栈的方式释放它们。 我们还希望能够以一种特别的方式从堆栈中分配内存,而不是按顺序迭代访问每个堆栈 我们找到了执行堆栈分配和释放的 问题是分配静态绑定到标记的生存期,而标记静态绑定到草稿行的生存期。虽然我们不希望分配的内存比相应分配的内存长,但生存期检查使得在一个对象中放置草稿行、标记和分配变得困难(或者可能不可能) 在所示的简单示例中,可以通过引用包含Scratchpad来解决这个问题,

从概念上讲,我们希望创建多个内存池,每个池单独充当一个堆栈。 在每个堆栈中,我们分配不同大小的对象,并以类似堆栈的方式释放它们。 我们还希望能够以一种特别的方式从堆栈中分配内存,而不是按顺序迭代访问每个堆栈

我们找到了执行堆栈分配和释放的

问题是分配静态绑定到
标记的生存期
,而
标记
静态绑定到
草稿行
的生存期。虽然我们不希望分配的内存比相应分配的内存长,但生存期检查使得在一个对象中放置草稿行、标记和分配变得困难(或者可能不可能)

在所示的简单示例中,可以通过引用包含Scratchpad来解决这个问题,但我不确定这是否可以推广到我们希望将多个标记和分配存储在一起的用例中

以下是未编译的示例代码:

extern crate scratchpad;
use scratchpad::{MarkerFront, Scratchpad};

#[derive(Debug)]
struct Stuff<'sp: 'a, 'a> {
    scratchpad: Scratchpad<&'sp mut [u8], &'sp mut [usize]>,
    marker: Option<MarkerFront<'a, &'sp mut [u8], &'sp mut [usize]>>,
}

fn main() {
    let pool0: &mut [u8] = &mut [0; 1024];
    let pool1: &mut [usize] = &mut [0; 64];

    let sp = Scratchpad::new(pool0, pool1);
    let mut stuff = Stuff {
        scratchpad: sp,
        marker: None,
    };
    stuff.marker = Some(stuff.scratchpad.mark_front().unwrap());
    println!("{:?}", stuff);
    stuff.marker = None;
    println!("{:?}", stuff);
} 
编译的示例代码:

extern crate scratchpad;
use scratchpad::{MarkerFront, Scratchpad};

#[derive(Debug)]
struct Stuff<'sp: 'a, 'a> {
    // This is now a reference
    scratchpad: &'sp Scratchpad<&'sp mut [u8], &'sp mut [usize]>,
    marker: Option<MarkerFront<'a, &'sp mut [u8], &'sp mut [usize]>>,
}

fn main() {
    let pool0: &mut [u8] = &mut [0; 1024];
    let pool1: &mut [usize] = &mut [0; 64];

    let sp = Scratchpad::new(pool0, pool1);
    let mut stuff = Stuff {
        scratchpad: &sp,
        marker: None,
    };
    stuff.marker = Some(stuff.scratchpad.mark_front().unwrap());
    println!("{:?}", stuff);
    stuff.marker = None;
    println!("{:?}", stuff);
}
外部板条箱刮板;
使用草稿行:{MarkerFront,scratchpad};
#[导出(调试)]

struct Stuff将草稿行、标记和分配放在一个对象中-您已经阅读了吗?听起来你确实遇到了它所描述的问题,尤其是因为你试图解决的问题是不安全的,并且会导致内存安全漏洞。您正试图在堆栈分配的数组中进行分配。当您将其移动到
草稿行
中,并且每次移动
草稿行
时,您都会移动数组,使其中的任何引用无效。生锈使你无法向自己的脚开枪。