double free 为什么不报错?

2023-03-15 10:53:56 +08:00
 enzo26

请教一下,下面的例子明明 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);
    
}
1576 次点击
所在节点    Rust
7 条回复
f1ush
2023-03-15 11:28:35 +08:00
以我浅薄的 rust 知识来看,
1. 这里根本没有发生 double free
2. 第一次 drop 掉的是 first_elem 的 copy ,不然 println 那里已经报错了
3. 只有最后一次 drop 才是真的把你的数组释放了
f1ush
2023-03-15 11:29:03 +08:00
BrettD
2023-03-15 11:39:52 +08:00
first_elem 是一个引用,不是值
enzo26
2023-03-15 13:26:27 +08:00
@BrettD drop 参数是引用的话,什么效果呢
Slurp
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 可能更好理解一点。
Slurp
2023-03-15 14:17:42 +08:00
enzo26
2023-03-16 09:59:19 +08:00
@Slurp 谢谢,明白了,确实 drop string 的引用好像也没有效果

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/924123

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX