rust - 是手动丢弃> 使用 mem::uninitialized 定义的行为?
问题描述
我有一个[ManuallyDrop<Box<T>>]
懒惰地填充的数组。为了实现这一点,我用ManuallyDrop::new(mem::uninitialized())
.
只要我只调用已ManuallyDrop::drop()
初始化的元素,这是定义明确的行为吗?
解决方案
如果您没有从未初始化的内存中读取或创建指向它的指针,那么这不应该是 UB。
您将需要做一些仔细的簿记以禁止访问未初始化的项目,并且只删除已初始化的项目。在未初始化内存的地方添加新项目需要使用 来完成ptr::write()
,以避免底层内存的无效丢弃。但是,如果您覆盖现有的有效值,则不应使用,ptr::write
因为您需要正确删除该值。
推荐阅读
- go - 什么是“regex grep”,应用于文件,Golang 中的等价物?
- python - 按标签检测和合并
- typescript - TypeScript:通用函数返回 null
- tensorflow - 为什么我的 anaconda 提示显示此错误?
- python - 索引时 int 对象不可下标
- android - NetworkStatsManager - 最早可能的开始时间是多少?
- php - 使用 AWS EC2 和 RDS MySQL 的 React 实施?
- javascript - 带参数的Nodejs回调
- ubuntu - 在 Ubuntu 上签署 VMware 驱动程序
- html - Css Rotate 45导致渐变边界中断