gpt4 book ai didi

pointers - 引用 int 的盒子和引用 rust 中的 int 之间的区别?

转载 作者:行者123 更新时间:2023-11-29 07:58:23 29 4
gpt4 key购买 nike

嗯,我最近开始用 Rust 编程,我需要帮助。这是我的代码。它应该引用堆分配的 int 并更改它的值。

let mut boxed_int = box 5;
let _ref_to_int = &mut *boxed_int; // why it is &int ???
*_ref_to_int = 10;

let mut boxed_int = box 5;
let _ref_to_int = &mut boxed_int;
*_ref_to_int = box 10;

最后一行是否从堆中删除 5 并在同一地址分配 10?或者 5 没有被删除,现在指针指向堆上的另一个地址,值为 10

最佳答案

这是带有显式类型注释的程序:

let mut boxed_int:   Box<int> = box 5;
let mut _ref_to_int: &mut int = &mut *boxed_int; // (1)
*_ref_to_int = 10;

let mut boxed_int: Box<int> = box 5;
let mut _ref_to_int: &mut Box<int> = &mut boxed_int; // (2)
*_ref_to_int = box 10;

小回顾:Box是封装堆分配的智能指针。它分配足够的空间来存储其包含类型的值并跟踪此内存,并在它超出范围时释放它。本质上,这提供了类似值的语义。

在(1)的第一段代码中你借用了boxed_int内容:第一,*取消引用 Box<int> , 获得 int , 然后 &mut立即创建一个引用,导致 &mut int .自然地,*_ref_to_int = 10覆盖框内容,所以 boxed_int之后将包含 10 个。这里没有分配或取消分配发生。

在(2)的第二段代码中你借用了boxed_int本身,所以 _ref_to_int类型为 &mut Box<int> . *_ref_to_int = box 10然后替换装箱值本身。因为旧的装箱值立即超出范围,它的析构函数被调用,并且相应的堆内存被释放。然后在堆上分配一 block 新的内存,并写入指向它的指针而不是刚刚释放的内存(box 10)。

所以,

Does the last line delete 5 from the heap and allocates 10 at the same address ?

是也不是。最后一行从堆中删除 5 并分配 10,但当然不是在同一地址。实际地址可能会有所不同,但您不会注意到它,因为 Box不暴露其数值。

关于pointers - 引用 int 的盒子和引用 rust 中的 int 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26256769/

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