【问题标题】:Temporary value does not live long enough临时价值的寿命不够长
【发布时间】:2019-02-13 09:03:25
【问题描述】:

我在处理这段代码时遇到了问题。我不知道为什么会出错。 它应该接受相机输入,然后将其放入缓冲区结构中,包含在推杆结构中。

extern crate rscam;
// use std::fs::File;
// use std::io::prelude::*;

const WIDTH: usize = 1280;
const HEIGHT: usize = 720;

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
struct Pyxel {
    r: u8,
    g: u8,
    b: u8,
}

impl Pyxel {
    fn new() -> Pyxel {
        Pyxel { r: 0, g: 0, b: 0 }
    }
}

#[repr(transparent)]
struct Buffer {
    pyxels: [[Pyxel; WIDTH]; HEIGHT],
}

// impl Buffer {
//  fn new(s: [[Pyxel; WIDTH]; HEIGHT]) -> Buffer {
//      Buffer {
//          pyxels: s,
//      }
//  }
// }

struct Putter {
    x: usize,
    y: usize,
    buffer: &'static mut Buffer,
}

impl Putter {
    fn put_pyxel(&mut self, r: u8, g: u8, b: u8) {
        if self.x >= WIDTH {
            self.move_down();
        }
        let col = self.x;
        let row = self.y;
        self.buffer.pyxels[row][col] = Pyxel { r: r, g: g, b: b };
        self.x += 1;
    }
    fn move_down(&mut self) {
        self.y += 1;
    }
    fn new() -> Putter {
        Putter {
            x: 0,
            y: 0,
            buffer: &mut Buffer {
                pyxels: [[Pyxel::new(); WIDTH]; HEIGHT],
            },
        }
    }
}

fn main() {
    let mut camera = rscam::new("/dev/video0").unwrap();
    camera
        .start(&rscam::Config {
            interval: (1, 30),
            resolution: (1280, 720),
            format: b"RGB3",
            ..Default::default()
        })
        .unwrap();

    let frame = camera.capture().unwrap();

    let mut putter = Putter::new();
}

错误:

error[E0597]: borrowed value does not live long enough
   --> src/main.rs:65:20
   |
57 |               buffer: &mut Buffer {
   |  __________________________^
58 | |                 pyxels: [[Pyxel::new(); WIDTH]; HEIGHT],
59 | |             },
   | |_____________^ temporary value does not live long enough
60 |           }
61 |       }
   |       - temporary value only lives until here
   |
  = note: borrowed value must be valid for the static lifetime..

如何使用推杆内部的缓冲区(结构)?

在大多数情况下,我理解这个错误的含义,而不是它的工作原理。我只需要一个解决方法或解决方案。任何帮助表示赞赏。我本可以写得更好,但我累了。

【问题讨论】:

  • 错误本身会通知您该问题,因为您正在范围内创建 Buffer 并将其分配给您的结构的指针,但是该值不够有效,因为它已经销毁,因为该值未存储在任何地方。
  • 为什么Putter::buffer 是参考?为什么不把缓冲区直接放在Putter中呢?
  • 究竟有什么区别

标签: rust


【解决方案1】:

这对我来说或多或少是逻辑错误。你应该仔细阅读Rust ownership

考虑一下您的代码将如何工作。

struct Putter {
    x: usize,
    y: usize,
    buffer: &'static mut Buffer,
}

Buffer 是一个引用,它的生命周期等于程序的生命周期, 'static 告诉编译器。错误信息很清楚,您正在就地创造临时价值并借用它。退出范围后它将立即被销毁,因此您的引用将指向无效内存。 Rust 中禁止悬挂引用。在像 C++ 这样的语言中,这个例子可以很好地编译,但会导致运行时错误。

要解决这个问题,buffer 应该拥有自己的价值,并且应该重新考虑结构设计,同时注意生命周期。

struct Putter {
    x: usize,
    y: usize,
    buffer: Buffer,
}

【讨论】:

  • 本书的哪一部分解释了这一点?
  • @JaredLanders Chapter 10.3 是关于生命周期的语法并谈论'static。下面是一段相关的摘录:生命周期注释不会改变任何引用的生存时间。 [... 它们] 描述了多个引用的生命周期相互之间的关系,而不影响生命周期。 你不能通过引用 &'static 来让一个事物永远存在;你必须让它永远存在,然后编译器会让你对它进行'static引用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-21
  • 2015-02-28
  • 1970-01-01
  • 1970-01-01
  • 2015-05-26
  • 1970-01-01
  • 2020-12-17
相关资源
最近更新 更多