请教一下,下面的例子明明 drop 了两次,为什么没报错呢,好像第一次没生效一样
fn test_double_free()
{
    let mut my_vec = Vec::new();
    my_vec.push("Hello");
    let first_elem = my_vec.first().unwrap();
    
    // 尝试在第一次释放后再次释放内存
    drop(first_elem);
    println!("{:?}", first_elem);
    drop(my_vec);
    
}
|      1f1ush      2023-03-15 11:28:35 +08:00 以我浅薄的 rust 知识来看, 1. 这里根本没有发生 double free 2. 第一次 drop 掉的是 first_elem 的 copy ,不然 println 那里已经报错了 3. 只有最后一次 drop 才是真的把你的数组释放了 | 
|      2f1ush      2023-03-15 11:29:03 +08:00 | 
|  |      3BrettD      2023-03-15 11:39:52 +08:00 first_elem 是一个引用,不是值 | 
|      5Slurp      2023-03-15 14:17:01 +08:00 这种代码跑 clippy 是不过的: error: calls to `std::mem::drop` with a reference instead of an owned value. Dropping a reference does nothing --> src/main.rs:8:3 | 8 | drop(first_elem); | ^^^^^^^^^^^^^^^^ | note: argument has type `&&str` --> src/main.rs:8:8 | 8 | drop(first_elem); | ^^^^^^^^^^ = help: for further information visit = note: `#[deny(clippy::drop_ref)]` on by default `Vec` 取元素一般都是返回引用,因此这里是 &&str 。drop 并没有什么用。 不过就算是 &str ,也是 drop 不掉的。这里的例子换成 String 可能更好理解一点。 | 
|      6Slurp      2023-03-15 14:17:42 +08:00 |