David's Blog

Lifetimes in Rust: Managing Borrowed Data

By David Li on Saturday, 24 December 2024 13:00:00 GMT

Lifetimes in Rust: Managing Borrowed Data

The Rust programming language has a unique system for managing borrowed data through lifetimes. Lifetimes ensure that references to data remain valid as long as the data exists. This article demonstrates Rust lifetimes through an example data structure containing vectors of strings and string references.

We will define a struct called Data that contains two fields:

  • strs: A vector of String
  • refs: A vector of &str references to the strings in strs

This structure will only be valid if the refs references always point to valid strings in strs. Rust lifetimes will enforce this constraint.

Here is the code:

struct Data<'a> {  
    strs: Vec<String>, 
    refs: Vec<&'a str>, 

The ‘a lifetime parameter on the struct specifies that the refs vector contains string slices that live at least as long as the lifetime ‘a. We’ll see how this connects to the actual lifetimes of the strings in strs shortly.

Now we’ll create one instance of the Data struct:

    let strings = vec![String::from("Hello"), String::from("World")]; 
    let string_slices = strings.iter().map(|s| &s[..]).collect();  
    let data = Data { strs: strings, refs: string_slices }; 

Here, the data structure is valid because:

  • The strings vector lives within the scope of the outer curly braces {}.
  • The string_slices vector contains references to the strings in strings.
  • The Data struct contains strings and string_slices, so the refs field is valid as long as the Data instance exists.
  • The Data instance goes out of scope at the end of the block, so all the references in refs become invalid at that point. This satisfies the lifetime constraint we specified.

In summary, Rust’s lifetimes ensure data references are always valid and prevent dangling pointers. They lead to safer and more robust Rust code. Through lifetime parameters, the compiler statically verifies that references outlive the data they refer to.

© Copyright 2023 by Astro Tech Blog. Built with ♥ by FriendlyUser. Last updated on 2023-05-25.