E0193 rust type_error ai_generated true

错误[E0193]:无法解构实现了 `Drop` 的类型;请使用 `std::mem::ManuallyDrop`

error[E0193]: cannot destructure a type that implements `Drop`; use `std::mem::ManuallyDrop`

ID: rust/e0193-cannot-destruct-type-with-drop

其他格式: JSON · Markdown 中文 · English
80%修复率
87%置信度
1证据数
2024-06-05首次发现

版本兼容性

版本状态引入弃用备注
rustc 1.79.0 active
rustc 1.80.0 active
rustc 1.82.0 active

根因分析

尝试对实现了 `Drop` trait 的类型进行模式匹配或解构,这会导致部分移动后析构函数运行,可能造成双重释放或未定义行为。

English

Trying to pattern match or destructure a value of a type that implements the `Drop` trait, which would cause a double drop or undefined behavior if the destructor runs after partial moves.

generic

官方文档

https://doc.rust-lang.org/error_codes/E0193.html

解决方案

  1. Wrap the field in `std::mem::ManuallyDrop` to prevent automatic drop, allowing destructuring.
  2. Refactor the type to not implement `Drop`, e.g., by moving cleanup logic to a separate method that users call explicitly.
  3. Use `std::mem::take` or `std::mem::replace` to extract values without destructuring, then handle cleanup manually.

无效尝试

常见但无效的做法:

  1. 75% 失败

    The error is about the language restriction on destructuring `Drop` types; implementing `Drop` again doesn't remove the restriction.

  2. 60% 失败

    Unsafe code can bypass the check but risks double drops or memory corruption; the compiler still prevents safe destructuring.