rust - 将 *mut T 强制转换为 *mut ManuallyDrop 是未定义的行为吗?
问题描述
根据文档,ManuallyDrop<T>
是一个零成本的包装器。这是否意味着我可以取消引用ManuallyDrop<T>
从原始指针转换为的原始指针T
?
解决方案
ManuallyDrop
声明#[repr(transparent)]
为:
#[stable(feature = "manually_drop", since = "1.20.0")]
#[lang = "manually_drop"]
#[derive(Copy, Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(transparent)]
pub struct ManuallyDrop<T: ?Sized> {
value: T,
}
#[repr(transparent)]
被描述为:
该属性可以应用于包含单个字段的类似新类型的结构。它表明 newtype 应该与该字段的类型完全一样表示,即,对于 ABI 目的 [sic],应该忽略 newtype:它不仅在内存中的布局相同,而且在函数调用中也以相同的方式传递。
[...]
PtrWithCustomZst
也完全像*const Foo
我相信执行这种转换是安全的。
真正的问题是你为什么要这样做?拥有指向ManuallyDrop
结构的指针似乎毫无意义。如果您有一个指向 a 的指针T
,则基础值将不会从一开始就被删除。如果将指针转换为引用(同时确保遵守引用规则),引用也不会删除基础值。
推荐阅读
- tensorflow - TensorFlow Keras 使用输入小于 32x32 的 MobileNetV2 模型
- postgresql - 创建一个临时表,循环并添加数据并从中选择?查询没有结果数据的目的地
- django - Django:制作均匀分布的混合项目提要
- r - 我可以根据许多相关条件在 R 中过滤(或创建新)数据集吗?
- sql - Oracle SQL 导出到 csv 显示错误:ORA-01722:无效数字
- tensorflow - 如何在 TF Slim 中表示嵌入层?
- authentication - 谷歌验证 oauth2 令牌在第二次处理时未被处理
- python - FileNotFoundError: [WinError 2] 系统找不到指定的文件:'a.jpg'
- python - 如何在我的 SQLite 数据库中保存文本框?
- c++ - 如何制作用户定义的对象?