Почему после деструктуры структуры происходит дроп-кол? - PullRequest
2 голосов
/ 09 апреля 2019

Я упаковываю C API.Чтобы упростить этот вопрос, вместо этого я использую NonNull::dangling.

use std::ptr::NonNull;

struct Foo(NonNull<i32>);

impl Drop for Foo {
    fn drop(&mut self) {
        println!("Foo::drop: {:?}", self.0);
    }
}

struct Moo(NonNull<i32>);
//impl Drop for Moo exists, but not important for question

fn f1() -> Result<Foo, String> {
    Ok(Foo(unsafe { NonNull::dangling() }))
}

fn f2() -> Result<Moo, String> {
    f1().map(|Foo(x)| Moo(x))//1
}

fn main() {
    f2();
}

В точке (1) я распаковываю / уничтожаю Foo.Я ожидаю, что после этого Foo::drop не должен вызываться, но по какой-то причине печатается Foo::drop.

Я ошибаюсь, что деструктуризация (let Struct1 { field1, field2, .. } = struct1;) должна предотвратить вызов Struct1::drop?

1 Ответ

5 голосов
/ 09 апреля 2019

Если вы замените NonNull на структуру, которая не реализует Copy, поведение будет более понятным:

#[derive(Debug)]
struct NoCopy;

struct Foo(NoCopy);

impl Drop for Foo {
    fn drop(&mut self) {
        println!("Foo::drop: {:?}", self.0);
    }
}

struct Moo(NoCopy);
//impl Drop for Moo exists, but not important for question

fn f1() -> Result<Foo, String> {
    Ok(Foo(NoCopy))
}

fn f2() -> Result<Moo, String> {
    f1().map(|Foo(x)| Moo(x))//1
}

fn main() {
    f2();
}

Это приводит к этой ошибке:

error[E0509]: cannot move out of type `Foo`, which implements the `Drop` trait
  --> src/main.rs:20:15
   |
20 |     f1().map(|Foo(x)| Moo(x))//1
   |               ^^^^-^
   |               |   |
   |               |   data moved here
   |               cannot move out of here
   |
note: move occurs because `x` has type `NoCopy`, which does not implement the `Copy` trait
  --> src/main.rs:20:19
   |
20 |     f1().map(|Foo(x)| Moo(x))//1
   |            

Следовательно, в (1) вы копируете NonNull из Foo и Foo удаляется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...