为什么结构体在创建时共享相同的地址,而在创建时删除时却有不同的地址?



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

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()中,您打印的是x的地址,当new()返回时,x被移动,因此这不再是实际地址,这就是为什么您看到相同的地址重复。

请参见"返回值是否移动?"。

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

相关内容

  • 没有找到相关文章

最新更新