gpt4 book ai didi

memory - 为什么结构在创建时共享相同的地址,而在删除时与创建的地址不同

转载 作者:行者123 更新时间:2023-12-03 11:27:18 25 4
gpt4 key购买 nike

我试图在创建结构时和删除结构时记录结构地址,当我运行下面的代码时,不仅两个结构记录相同的地址,而且两个结构在删除时记录不同的地址。有正确的方法吗?

struct TestStruct {
val: i32
}

impl TestStruct {
fn new(val: i32) -> Self {
let x = TestStruct{val};
println!("creating struct {:p}", &x as *const _);
x
}
}

impl Drop for TestStruct {
fn drop(&mut self) {
println!("destroying struct {:p}", &self as *const _)
}
}

fn main() {
let s1 = TestStruct::new(1);
let s2 = TestStruct::new(2);
}

输出:

creating struct 0x7ffef1f96e44
creating struct 0x7ffef1f96e44
destroying struct 0x7ffef1f96e38
destroying struct 0x7ffef1f96e38

最佳答案

new() 中,当 new() 返回 x 时,您正在打印 x 的地址已移动,因此不再是实际地址,这就是为什么您会看到重复的相同地址。

另见 "Is a returned value moved or not?" .

drop() 中,您实际上打印的是 &Self 的地址,而不是 Self 本身。您需要将 &self as *const _ 更改为 self 因为 self 已经是一个引用。现在它正确地打印了两个不同的地址。

如果您随后尝试在 main() 中打印 s1s2 的地址,则地址匹配。

impl TestStruct {
fn new(val: i32) -> Self {
let x = TestStruct { val };
x
}
}

impl Drop for TestStruct {
fn drop(&mut self) {
println!("destroying struct {:p}", self);
}
}

fn main() {
let s1 = TestStruct::new(1);
println!("creating struct {:p}", &s1);

let s2 = TestStruct::new(2);
println!("creating struct {:p}", &s2);
}

输出:

creating struct 0xb8682ff59c   <- s1
creating struct 0xb8682ff5f4 <- s2
destroying struct 0xb8682ff5f4 <- s2
destroying struct 0xb8682ff59c <- s1

关于memory - 为什么结构在创建时共享相同的地址,而在删除时与创建的地址不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65834774/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com