Malloc是一个具有Rust布局的数组

Malloc是一个具有Rust布局的数组,rust,Rust,我当前的代码: use std::alloc::{alloc, dealloc, Layout}; unsafe { let n = 0x10000; // I get this value from a function let layout = Layout::new::<[u8; n]>();// n is non-constant value issue E0435 E0425 let mut ptr = alloc(layout); *(ptr as *m

我当前的代码:

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

unsafe {
  let n = 0x10000; // I get this value from a function
  let layout = Layout::new::<[u8; n]>();// n is non-constant value issue E0435 E0425
  let mut ptr = alloc(layout);
  *(ptr as *mut u8) = 42;
}
如果我想分配0x10000堆呢?我已经读过,但我错过了分配多个u8的示例。布局::新建::效果良好

在Rust中,这是不安全地分配内存的最佳方法吗?还有,最好的安全方法是什么

或者,我一直在使用效果非常好的:

let n = 0x10000;
let mut v<u8>; = Vec::with_capacity(n);
unsafe { v.set_len(n); }
要分配类型为T的大小项目的切片,只需创建它们的向量:

//0x10000项的可调整大小的向量: 让vec:vec=vec![0u8;0x10000]; //指向0x10000项固定切片的唯一指针框: 让装箱的_切片:Box=vec![0u8;0x10000]。放入装箱的切片中; 请注意,这将数组的每个值初始化为0,这是必需的,因为Rust通常期望值被初始化,而未初始化的内存可能导致未定义的行为,即使对于像u8这样的整数类型也是如此

一般来说,我还建议您避免在代码中直接使用std::mem::alloc。在使用它时,您需要更仔细地考虑如何处理内存,错误的空间更大,与上面的安全变体相比,几乎没有任何显著的优势。即使您想要分配未初始化的内存并自己初始化它,您可能最好使用Vec或Box来分配一个T类型的大小项目片,您应该只创建一个向量:

//0x10000项的可调整大小的向量: 让vec:vec=vec![0u8;0x10000]; //指向0x10000项固定切片的唯一指针框: 让装箱的_切片:Box=vec![0u8;0x10000]。放入装箱的切片中; 请注意,这将数组的每个值初始化为0,这是必需的,因为Rust通常期望值被初始化,而未初始化的内存可能导致未定义的行为,即使对于像u8这样的整数类型也是如此


一般来说,我还建议您避免在代码中直接使用std::mem::alloc。在使用它时,您需要更仔细地考虑如何处理内存,错误的空间更大,与上面的安全变体相比,几乎没有任何显著的优势。即使您想分配未初始化的内存并自己进行初始化,也最好使用Vec或BOX。为什么需要使用不安全的代码来分配内存?为什么安全方法还不够?我有兴趣学习这两种方法,因为它们可以用于不同的用例。在这两种方法之间,似乎您在初始化缓冲区方面遇到了一些问题,但您实际上并没有问这个问题,只是问了一些您认为应该如何工作的问题。使用分配器API在Rust中是不寻常的,因此,如果您在认为需要它的地方遇到问题,您应该询问该问题,而不是询问分配器API本身。也许这就是答案,或者可能有另一个标准API比返回原始指针更能解决您的问题。如何使用std::alloc分配数组的直接答案用于布局。您问:这是在Rust中不安全地分配内存的最佳方法吗?那么什么是最好的安全方法呢?这两个问题的答案都是:改用Vec。另一个问题的答案充分涵盖了这一点,这就是为什么我将其标记为副本。可以说,我或许应该投票决定以“需要关注”作为结束,因为它包含多个问题;但是,我觉得这两个问题的答案其实是一样的,那就是Vec是在Rust中分配数组的安全且惯用的方法,因此我将其视为您直接提出的问题。为什么需要使用不安全的代码来分配内存?为什么安全方法还不够?我有兴趣学习这两种方法,因为它们可以用于不同的用例。在这两种方法之间,似乎您在初始化缓冲区方面遇到了一些问题,但您实际上并没有问这个问题,只是问了一些您认为应该如何工作的问题。使用分配器API在Rust中是不寻常的,因此,如果您在认为需要它的地方遇到问题,您应该询问该问题,而不是询问分配器API本身。也许这就是答案,或者可能有另一个标准API比返回原始指针更能解决您的问题。如何使用std::alloc分配数组的直接答案用于布局。您问:这是在Rust中不安全地分配内存的最佳方法吗?那么什么是最好的安全方法呢?这两个问题的答案都是:改用Vec。另一个问题的答案充分涵盖了这一点,这就是为什么我将其标记为副本。可以说,我或许应该投票决定以“需要关注”作为结束,因为它包含多个问题;然而,我觉得这两个问题的答案其实是一样的,那就是Vec是在Rust中分配数组的安全且惯用的方法,因此我将其视为您直接问过的问题。我之所以想知道不安全的替代方案,是因为我想创建
e是一个非常大的缓冲区,因此不在堆栈上。但是我不想初始化这个缓冲区的值。它是一个缓冲区,值将被替换。没有安全的方法使堆分配的缓冲区未初始化?你能介绍一下吗Box@AntoninGAVREL . 我想知道这个不安全的替代方案的原因是因为我想创建一个非常大的缓冲区,因此不在堆栈上。但是我不想初始化这个缓冲区的值。它是一个缓冲区,值将被替换。没有安全的方法使堆分配的缓冲区未初始化?你能介绍一下吗Box@AntoninGAVREL . 它是缺失的,但也许您可以将这个总体想法应用到您的代码中。