MaybeUninit.write() и присваивание
// Copyright 2026 Google LLC
// SPDX-License-Identifier: Apache-2.0
use std::mem::MaybeUninit;
fn main() {
let mut buf = MaybeUninit::<String>::uninit();
// Инициализация
buf.write(String::from("Hello, Rust!"));
// Перезапись
buf.write(String::from("Hi again"));
// Присваивание заменяет всё значение MaybeUninit.
buf = MaybeUninit::new(String::from("Goodbye"));
// Убеждаемся, что внутреннее значение уничтожено
let _ = unsafe { buf.assume_init() };
}
Замена внутренних значений может приводить к утечкам памяти, потому что семантика drop отличается от большинства типов. MaybeUninit<T> не вызывает деструктор для своего T.
MaybeUninit::write() использует ptr::write: он инициализирует память на месте, не читая и не уничтожая старое содержимое. Это именно то, что нужно, когда память может быть неинициализированной, но это также означает утечку, если там уже было живое значение.
Присваивание, например buf = MaybeUninit::new(value), заменяет весь MaybeUninit. Старое значение MaybeUninit перемещается и затем уничтожается, но у MaybeUninit нет деструктора для T, поэтому внутреннее значение не уничтожается. Если в старом слоте был инициализированный объект, он утекает, как и при write().
Если нужно обычное поведение drop, сообщите Rust, что значение инициализировано, с помощью assume_init или одного из связанных методов.