首页 > 解决方案 > 是手动丢弃> 使用 mem::uninitialized 定义的行为?

问题描述

我有一个[ManuallyDrop<Box<T>>]懒惰地填充的数组。为了实现这一点,我用ManuallyDrop::new(mem::uninitialized()).

只要我只调用已ManuallyDrop::drop()初始化的元素,这是定义明确的行为吗?

标签: rustundefined-behaviorunsafe

解决方案


如果您没有从未初始化的内存中读取或创建指向它的指针,那么这不应该是 UB。

您将需要做一些仔细的簿记以禁止访问未初始化的项目,并且只删除已初始化的项目。在未初始化内存的地方添加新项目需要使用 来完成ptr::write(),以避免底层内存的无效丢弃。但是,如果您覆盖现有的有效值,则不应使用ptr::write因为您需要正确删除该值。


推荐阅读