Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 将*mut T cast解引用到*mut ManuallyDrop<;T>;?_Rust_Undefined Behavior_Unsafe_Raw Pointer - Fatal编程技术网

Rust 将*mut T cast解引用到*mut ManuallyDrop<;T>;?

Rust 将*mut T cast解引用到*mut ManuallyDrop<;T>;?,rust,undefined-behavior,unsafe,raw-pointer,Rust,Undefined Behavior,Unsafe,Raw Pointer,根据文档,ManuallyDrop是一个零成本包装器。这是否意味着我可以取消引用从原始指针到T的ManuallyDrop的原始指针?ManuallyDrop是: #[稳定(feature=“manually_drop”,自=“1.20.0”)] #[lang=“手动放置”] #[派生(复制、克隆、调试、默认、PartialEq、Eq、PartialOrd、Ord、散列)] #[报告(透明)] pub struct ManuallyDrop{ 值:T, } #[repr(透明)]是: 该属性可以

根据文档,
ManuallyDrop
是一个零成本包装器。这是否意味着我可以取消引用从原始指针到
T
ManuallyDrop
的原始指针?

ManuallyDrop
是:

#[稳定(feature=“manually_drop”,自=“1.20.0”)]
#[lang=“手动放置”]
#[派生(复制、克隆、调试、默认、PartialEq、Eq、PartialOrd、Ord、散列)]
#[报告(透明)]
pub struct ManuallyDrop{
值:T,
}
#[repr(透明)]
是:

该属性可以应用于包含单个字段的类似于newtype的结构。它表示新类型应与该字段的类型完全相同,也就是说,对于ABI purpoposes[sic]:新类型不仅在内存中布局相同,而且在函数调用中传递相同

[……]

PtrWithCustomZst
的表示方式也与
*const Foo

我相信进行这种转变是安全的


真正的问题是你为什么要这样做?将指针指向手动删除结构似乎毫无意义。如果您有一个指向
T
的指针,则不会首先删除基础值。如果将指针转换为引用(同时确保遵守引用规则),则引用也不会删除基础值

#[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,
}