Задать вопрос

Слайс на неинициализированную память?

Есть указатель на область памяти, я не могу её инициализировать т.к. она слишком велика, вместо этого я буду инициализировать элементы отдельно, когда придёт время.
Я хочу создать слайс из этого указателя с помощью slice::from_raw_parts_mut(), но создание ссылочного типа на неинициализированную память это UB. Как сделать это правильно?
Вот такой массив указателей я хочу сделать:
&mut [*mut State]
Я решил использовать MaybeUninit:
&mut [MaybeUninit<*mut State>]
Но я не знаю будет ли это работать, поскольку сами элементы MaybeUninit не инициализированы с помощью MaybeUninit::uninit()
  • Вопрос задан
  • 348 просмотров
Подписаться 3 Простой Комментировать
Решения вопроса 1
bingo347
@bingo347
Crazy on performance...
MaybeUninit под капотом - это union, то есть компилятор ничего не знает, инициализированное там значение или нет и перекладывает эту ответственность на программиста. А значит UB здесь не будет.
То есть спокойно делаете &mut [MaybeUninit<*mut State>], инициализируете элементы и после std::mem::transmute в &mut [*mut State]
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы