ManuallyDrop<Box<T>> 是否具有 mem::uninitialized 定义的行为?
Is ManuallyDrop<Box<T>> with mem::uninitialized defined behavior?
我有一个 [ManuallyDrop<Box<T>>]
的数组,它是懒惰填充的。为了实现这一点,我 "initialize" 数组 ManuallyDrop::new(mem::uninitialized())
。
只要我只对已初始化的元素调用 ManuallyDrop::drop()
,这就是定义明确的行为吗?
如果你没有从未初始化的内存中读取或创建指向它的指针,那么这应该不是 UB。
您需要仔细记录以禁止访问未初始化的项目,并且只删除已初始化的项目。在有未初始化内存的地方添加一个新项目需要使用 ptr::write()
来完成,以避免在底层内存上进行无效删除。但是,如果您覆盖现有的有效值,那么您应该 而不是 使用 ptr::write
因为您需要正确删除该值。
我有一个 [ManuallyDrop<Box<T>>]
的数组,它是懒惰填充的。为了实现这一点,我 "initialize" 数组 ManuallyDrop::new(mem::uninitialized())
。
只要我只对已初始化的元素调用 ManuallyDrop::drop()
,这就是定义明确的行为吗?
如果你没有从未初始化的内存中读取或创建指向它的指针,那么这应该不是 UB。
您需要仔细记录以禁止访问未初始化的项目,并且只删除已初始化的项目。在有未初始化内存的地方添加一个新项目需要使用 ptr::write()
来完成,以避免在底层内存上进行无效删除。但是,如果您覆盖现有的有效值,那么您应该 而不是 使用 ptr::write
因为您需要正确删除该值。