ManuallyDropс mem :: неинициализированным определенным поведением? - PullRequest
0 голосов
/ 19 октября 2018

У меня есть массив с [ManuallyDrop<Box<T>>], который заполнен лениво.Чтобы понять это, я «инициализирую» массив с помощью ManuallyDrop::new(mem::uninitialized()).

Является ли это четко определенным поведением, если я вызываю ManuallyDrop::drop() только для инициализированных элементов?

1 Ответ

0 голосов
/ 19 октября 2018

При условии, что вы не читаете из неинициализированной памяти и не создаете на нее указатели, это не должно быть UB.

Вам потребуется вести тщательную бухгалтерию, чтобы запретить доступ к неинициализированным элементам и отбрасывать только инициализированные.Добавление нового элемента, где есть неинициализированная память, необходимо выполнить с помощью ptr::write(), чтобы избежать недопустимого падения основной памяти.Но если вы перезаписываете существующее допустимое значение, тогда вы должны не использовать ptr::write, потому что вам нужно, чтобы это значение было правильно отброшено.

...