Cairo 中的智能指针是一种高级数据结构,它通过为普通指针增加安全特性来确保内存管理既安全又高效,可以避免解引用空指针、访问未初始化内存等常见问题。
智能指针的行为和普通指针一样,但它会跟踪所有权并确保内存访问安全,从而避免解引用空指针或悬空指针之类的问题。
Cairo 提供了多种智能指针类型,例如Box<T>和Nullable<T>:
Box<T>:把数据存储在一个特殊的内存段中,非常适合大型数据或大小在运行时才能确定的数据。
它允许在不复制数据的情况下转移所有权。Nullable<T>:指向类型T的有效值或null,适合处理可选值。智能指针有助于防止不安全的的内存访问,确保不再需要的内存会被自动释放,从而降低内存泄漏的风险。
Box<T>处理递归类型像Box<T>这样的智能指针可以安全地处理二叉树这类递归类型,它高效地分配内存,并避免无限递归。
use core::box::{BoxTrait};
#[derive(Copy, Drop)]
enum BinaryTree {
Leaf: u32,
Node: (u32, Box<BinaryTree>, Box<BinaryTree>),
}
fn main() {
let leaf1 = BinaryTree::Leaf(1);
let leaf2 = BinaryTree::Leaf(2);
let node = BinaryTree::Node((3, BoxTrait::new(leaf1), BoxTrait::new(leaf2)));
println!("{:?}", node);
}
智能指针通过传递数据的引用,而不是复制大型结构体来提升性能,减少了内存开销。
// `Cart` is a large struct that contains a lot of information
fn pass_pointer(cart: Box<Cart>) {
let cart = cart.unbox();
println!("{} is shopping today and bought {} items", cart.buyer, cart.items);
}
在Chrono Realms中,Time Keepers 要处理的往往不只是由时间线构成的树,还有Chrono Chains,也就是由一个个TimeNode链接而成的序列,每个节点都代表时间中的某个特定时刻。 Chrono Chain是一条由先后相继的时刻组成的直线路径,其中每个TimeNode都连接到下一个节点。 在穿梭于一系列特定事件时,Chrono Chains很有用,因为它们让 Time Keepers 能够沿着单条时间线前进。
不过,要处理这些可能很长的Chrono Chains,Time Keepers 会使用智能指针(Box<t>)<strong>来安全地管理和遍历这些时刻列表,而不会造成不必要的内存复制或溢出。 每个</strong>TimeNode</t>都持有对下一个节点的引用,从而构成递归结构。
作为学徒,你的任务是用智能指针把Chrono Chain实现为一种递归的列表结构。
在这个练习中,你将:
ChronoChain枚举,用来表示一串时刻。Box<T>智能指针来存储递归的节点。u32值组成的数组创建ChronoChain。ChronoChain并把列表中存储的值相加。ChronoChain枚举创建一个包含两个变体的递归枚举ChronoChain:
End:表示列表的结尾。Link:包含一个u32值,以及一个指向链中下一个节点的装箱引用。编写一个函数ChronoChain::build,接收一个由u32值组成的数组,返回一个ChronoChain,并使用智能指针把这些值按顺序链接起来。
编写一个函数ChronoChain::sum,递归地遍历ChronoChain,并把所有节点的值相加。
fn main() {
// Create a ChronoChain from an array of values
let chrono_chain = ChronoChain::build(array![10, 20, 30]);
// Sum the values in the ChronoChain
let total_sum = chrono_chain.sum();
println!("Total Time Power: {}", total_sum);
}