Rust手动内存管理

时间:2018-01-28 10:43:36

标签: memory-management rust

当我开始学习C时,我实现了常用的数据结构,如列表,地图和树。我使用malloccallocreallocfree在请求时手动管理内存。我使用newdelete对C ++做了同样的事情。

现在来了Rust。看起来Rust没有提供任何与C或C ++相对应的函数或运算符,至少在稳定版本中是这样。

Heap结构和ptr模块(标有experimental)是否需要查看此类内容?

我知道这些数据结构已经在语言中。这是为了学习。

3 个答案:

答案 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 ++程序员,您需要了解newnew的工作原理,才能正确使用智能指针。

Rust的目标是比C或C ++更安全。它的智能指针封装了 all 有关如何在低级别处理内存的详细信息。如果您自己实现智能指针,则只需要知道如何分配和释放原始内存。由于管理所有权的方式,您实际上需要知道更多的语言细节才能编写正确的代码。它不是像C或C ++那样的第一或第二课:它是一个非常高级的主题,并且许多Rust程序员从不需要了解。

如果您想了解如何在堆上分配内存,delete类就是开始使用它的地方。在Rust书中,the chapter about smart pointers 关于内存分配的章节。

答案 1 :(得分:7)

直接访问Rust中的内存分配器是非常不寻常的。您通常希望将智能指针构造函数(Box::newRc::newArc::new)用于单个对象,如果需要堆,则只需使用VecBox<[T]>基于阵列。

如果你真的想分配内存并获得一个原始指针,你可以看一下Rc的实现。 (不是BoxBox是神奇的。)为了获得它的后备内存,它实际创建了一个Box,然后使用它的into_raw_non_null函数来获取原始指针。对于销毁,它使用分配器API,但也可以使用Box::from_raw然后使用drop

答案 2 :(得分:2)

尽管实际上不建议这样做,但您可以像从C一样习惯使用mallocfree。它不是很有用,但是它的外观如下:

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);
}

它不是mallocfree,但可以完成工作。 仅在要创建自己的智能指针时才应使用它。