Rust MemWriter 返回指向 Buffer 的指针

标签 rust lifetime

我想让一个函数使用 MemWriter 写入一些字节,然后返回一个指向缓冲区的指针。在这种情况下,我很难理解如何使用生命周期。我将如何使下面的代码工作以及我应该阅读什么来填补我的知识空白?

struct Request<T: Encodable> {
  id: i16,
  e:  T
}

impl <T: Encodable> Request<T> {
  fn serialize<'s>(&'s self) -> io::IoResult<&'s Vec<u8>> {
    let mut writer = io::MemWriter::new();
    try!(writer.write_be_i16(0 as i16));
    let buf = writer.unwrap();
    let size = buf.len();

    let result: io::IoResult<&Vec<u8>> = Ok(&buf);
    result
  }
}

最佳答案

您不能返回对无处存储的缓冲区的引用

您需要在内部存储缓冲区,否则您会尝试返回对已释放内存的引用,这是危险的,因此会被生命周期检查器禁止。

例如像这样:

struct Request<T: Encodable> {
  buf: Vec<u8>
}

impl <T: Encodable> Request<T> {
  fn serialize<'s>(&'s mut self) -> io::IoResult<&'s Vec<u8>> {           //'
    let mut writer = io::MemWriter::new();
    try!(writer.write_be_i16(0 as i16));
    self.buf = writer.unwrap();
    let size = self.buf.len();

    let result: io::IoResult<&Vec<u8>> = Ok(&self.buf);
    result
  }
}

或者,正如 Vladimir Matveev 在评论中指出的那样,您可以简单地返回 VecVec 已经是一个安全地管理堆上内存的容器,在大多数情况下直接返回它应该对你有好处,这样你就可以避免任何生命周期问题。

impl <T: Encodable> Request<T> {
  fn serialize(&mut self) -> io::IoResult<Vec<u8>> {
    let mut writer = io::MemWriter::new();
    try!(writer.write_be_i16(0 as i16));
    let buf = writer.unwrap();
    let size = buf.len();
    Ok(buf)
  }
}

关于Rust MemWriter 返回指向 Buffer 的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25660689/

相关文章:

rust - 当使用带有生存期说明符的函数时,借入的值的生命周期不足

java - 如何确定变量是否有作用域和生存期?

rust - 如何修复缺少的生命周期说明符?

rust - 代码使用省略的生命周期,而不是显式

error-handling - 如果没有结果,则从 for 循环返回结果或不返回结果

docker - 无法使用 Rust 可执行文件运行 Docker 镜像

openssl - 为 Raspberry Pi 2 交叉编译 rust-openssl

c++ - std::string::substr 返回的对象的生命周期

reference - 如何制作引用文献的副本? (生活问题)

Rust 编译错误 - 无法推断类型参数的类型