rust / expert
Snippet
Manuelle Speicherallokation mit benutzerdefinierten Layouts
Dieses Snippet demonstriert die manuelle Speicherverwaltung auf dem Heap unter Verwendung der rohen Allokations-API der Standardbibliothek. Wir erstellen ein Speicherlayout für ein Array aus 4 u32-Elementen, allokieren den nicht initialisierten Speicher, schreiben Werte über rohe Zeiger, lesen diese wieder aus und deallokieren schließlich den Speicherblock, um Lecks zu verhindern.
snippet.rs
rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
use std::alloc::{alloc, dealloc, Layout};fn main() {unsafe {let layout = Layout::array::<u32>(4).unwrap();let ptr = alloc(layout) as *mut u32;if ptr.is_null() {panic!("Allocation failed");}for i in 0..4 {ptr.add(i).write(i as u32 * 10);}for i in 0..4 {let val = ptr.add(i).read();assert_eq!(val, i as u32 * 10);}dealloc(ptr as *mut u8, layout);}}
Erklärung
1
Layout::array::<u32>(4).unwrap()
Berechnet die Größe und Ausrichtungsanforderungen für ein Array aus vier vorzeichenlosen 32-Bit-Ganzzahlen.
2
alloc(layout)
Allokiert einen Heap-Speicherblock, der dem angegebenen Layout entspricht, und gibt einen rohen *mut u8-Zeiger zurück.
3
ptr.add(i).write(...)
Berechnet den Offset für das i-te Element und schreibt den Wert direkt in den nicht initialisierten Speicherbereich.
4
dealloc(ptr as *mut u8, layout)
Gibt den allokierten Speicherblock unter Verwendung des ursprünglichen Zeigers und Layouts wieder an den Allokator frei.