当我开始学习C时,我实现了常用的数据结构,如列表,地图和树。我使用malloc
,calloc
,realloc
和free
在请求时手动管理内存。我使用new
和delete
对C ++做了同样的事情。
现在来了Rust。看起来Rust没有提供任何与C或C ++相对应的函数或运算符,至少在稳定版本中是这样。
Heap
结构和ptr
模块(标有experimental
)是否需要查看此类内容?
我知道这些数据结构已经在语言中。这是为了学习。
答案 0 :(得分:8)
class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return new MaterialApp( title: 'WaterFlow Target', theme: new ThemeData( primarySwatch: Colors.blue, ), home: new MyHomePage(title: 'WaterFlow'), ); } }
结构和Heap
模块(标有实验)是否需要考虑这类事情?
不,作为初学者,你绝对不应该从那里开始。当你开始学习C时,ptr
就是所有的,而且它仍然是语言中容易出错的部分 - 但如果没有它,你就不能编写任何非平凡的程序。对于C程序员来说,了解malloc
以及如何避免所有陷阱(内存泄漏,使用后免费等)非常重要。
在现代C ++中,人们被教导使用智能指针来管理内存,而不是手动使用malloc
,但你仍然需要调用delete
来分配用于智能指针管理的内存。它好多了,但那里还有一些风险。而且,作为C ++程序员,您需要了解new
和new
的工作原理,才能正确使用智能指针。
Rust的目标是比C或C ++更安全。它的智能指针封装了 all 有关如何在低级别处理内存的详细信息。如果您自己实现智能指针,则只需要知道如何分配和释放原始内存。由于管理所有权的方式,您实际上需要知道更多的语言细节才能编写正确的代码。它不是像C或C ++那样的第一或第二课:它是一个非常高级的主题,并且许多Rust程序员从不需要了解。
如果您想了解如何在堆上分配内存,delete
类就是开始使用它的地方。在Rust书中,the chapter about smart pointers 是关于内存分配的章节。
答案 1 :(得分:7)
直接访问Rust中的内存分配器是非常不寻常的。您通常希望将智能指针构造函数(Box::new
,Rc::new
,Arc::new
)用于单个对象,如果需要堆,则只需使用Vec
或Box<[T]>
基于阵列。
如果你真的想分配内存并获得一个原始指针,你可以看一下Rc
的实现。 (不是Box
。Box
是神奇的。)为了获得它的后备内存,它实际创建了一个Box
,然后使用它的into_raw_non_null
函数来获取原始指针。对于销毁,它使用分配器API,但也可以使用Box::from_raw
然后使用drop
。
答案 2 :(得分:2)
尽管实际上不建议这样做,但您可以像从C一样习惯使用malloc
和free
。它不是很有用,但是它的外观如下:
extern crate libc;
use std::mem;
fn main() {
unsafe {
let my_num: *mut i32 = libc::malloc(mem::size_of::<i32>() as libc::size_t) as *mut i32;
if my_num.is_null() {
panic!("failed to allocate memory");
}
libc::free(my_num as *mut libc::c_void);
}
}
正是您所期望的。 同样,您实际上不需要在Rust中执行此操作,但是有可能。
或者,更生锈的方法是使用标准库。
这是一个示例:
use std::alloc::{alloc, dealloc, Layout};
unsafe {
let layout = Layout::new::<u16>();
let ptr = alloc(layout);
*(ptr as *mut u16) = 42;
assert_eq!(*(ptr as *mut u16), 42);
dealloc(ptr, layout);
}
它不是malloc
和free
,但可以完成工作。
仅在要创建自己的智能指针时才应使用它。