我正在更新一些使用智能指针和其他内存管理代码的旧Rust代码,这些代码在版本1发布之前已被弃用和删除。
是否可以直接替换旧智能指针,或者使用Box等分配内存更好?
我有代码如((这非常简化!)
struct my_rectangle {
x: i32,
y: i32,
length: i32,
breadth: i32,
}
fn allocate_rect() {
let x: ~my_rectangle = ~my_rectangle{x: 5, y: 5, length: 25, breadth:15};
}
和
fn firstMethod() {
let memblock: @int = @256;
secondMethod(memblock);
println!(“%d”, *memblock);
}
fn secondMethod(memblock: @int) {
let secMemblock: @int = memblock;
}
这在1.0之前工作正常,但现在无法构建。
答案 0 :(得分:4)
~T
已更改为Box<T>
。 ~expr
现在应为Box::new(expr)
。
@T
已被删除;它本来是指向垃圾收集对象的指针,但事实并非如此。标准库提供了引用计数指针Rc<T>
和Arc<T>
,它应涵盖大多数用例。
Rust已经改变了很多,直到1.0。您可能需要阅读The Rust Programming Language以了解最新动态。
答案 1 :(得分:1)
您可以~T
替换Box<T>
,~[T]
替换Vec<T>
。 @T
智能指针可以由Rc<T>
替换,@[T]
可以替换为Rc<RefCell<Vec<T>>>
。注意不要用Rc<T>
创建循环,不再有循环收集器。如果您希望更新的代码看起来与示例中的代码类似,那么我建议您根本不使用指针。 ~T
(或Box<T>
)特别容易被滥用,通常可以用简单的T
替换。
答案 2 :(得分:1)
其他答案涵盖了原则,因此您的具体示例已更新:
struct MyRectangle {
x: i32,
y: i32,
length: i32,
breadth: i32,
}
fn allocate_rect() {
Box::new(MyRectangle {
x: 5,
y: 5,
length: 25,
breadth: 15,
});
}
use std::rc::Rc;
fn first_method() {
let memblock = Rc::new(256);
second_method(memblock.clone());
println!("{}", memblock);
}
fn second_method(memblock: Rc<isize>) {
let sec_memblock = memblock;
}
int
和uint
分别成为isize
和usize
。但是,你不应该盲目地改变它们 - 通常情况下,特定尺寸的整数更好。CamelCase
,而函数使用snake_case
。println!
不再使用printf样式的格式字符串。相反,有{}
和{:?}
等占位符与Display
和Debug
等特征相对应。println!
的论据。second_method
会转移参数的所有权,然后您无法打印它。您需要调用clone
来增加引用计数并将克隆值传递给函数。我的建议是评估你是否真的需要包装许多这些值。在某些情况下,您可以接受引用或执行该值的副本(应该很便宜)。