Rust手动内存管理

Lpp*_*Edd 3 memory-management rust

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

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

Heap结构和ptr模块(标记experimental)中的那些看对这种事情?

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

tom*_*une 13

虽然它真的不建议永远做到这一点,你可以用mallocfree你一样是从C.用于这不是非常有用的,但这里是它的外观:

extern crate libc; // 0.2.65

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

更好的方法是使用 Rust 的标准库:

use std::alloc::{alloc, dealloc, Layout};

fn main() {
    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);
    }
}
Run Code Online (Sandbox Code Playgroud)


Dan*_*lme 10

Heap结构和ptr模块(标有实验)中的那些看对这种事情?

不,作为初学者,你绝对不应该从那里开始.当你开始学习C时,它malloc就是所有的,并且它仍然是语言中容易出错的一部分 - 但如果没有它,你就不能编写任何非平凡的程序.对于C程序员来说,了解malloc和如何避免所有陷阱(内存泄漏,使用后免费等)非常重要.

在现代C++中,人们被教导使用智能指针来管理内存,而不是delete手动使用,但是你仍然需要调用new来为你的智能指针分配内存来管理.它好多了,但那里还有一些风险.而且是,作为一个C++程序员,你需要学习如何newdelete工作,以便正确地使用智能指针.

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

如果您想了解如何在堆上分配内存,那么Box该类就是开始使用它的地方.在锈书,关于智能指针的章节 关于内存分配的章节.

  • "在现代C++中,你仍然需要调用new来为智能指针分配内存来管理." - >否.在现代C++中,人们使用[`std :: make_unique`](http://en.cppreference.com/w/cpp/memory/unique_ptr/make_unique)和[`std :: make_shared`](http: //en.cppreference.com/w/cpp/memory/shared_ptr/make_shared). (9认同)
  • 如果你在C++ 11(以及更高版本)中编写`new`,那你就是在寻找麻烦.`std :: vector`和`std :: make_unique`应该涵盖99%的用例,`s​​td :: shared_ptr` 99%的剩余案例.应该严格保留"new"的奇怪用法,以便在基础库中实现更高级别的抽象. (5认同)
  • "如果我读了一本关于Cpp的书,那么我首先要了解的是"那本书多大了? (3认同)
  • 顺便说一句,Stroustrup 在其自己的书的第 171 页开始讨论指针和内存管理。 (2认同)

Seb*_*edl 7

直接访问Rust中的内存分配器是非常不寻常的.通常你想使用智能指针的构造函数(Box::new,Rc::new,Arc::new)对单个对象和只使用Vec或者Box<[T]>如果你想要一个基于堆的阵列.

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

  • 你为什么要? (2认同)
  • @LppEdd https://manishearth.github.io/blog/2017/01/10/rust-tidbits-box-is-special/ (2认同)