Who Owns What? Understanding Rust’s Memory Ownership
Rijul Rajesh

Rijul Rajesh @rijultp

About: Dev | Technical Writer | Learner | Powered by ☕ and 🐧

Joined:
Nov 12, 2023

Who Owns What? Understanding Rust’s Memory Ownership

Publish Date: Jun 2
11 0

Rust is famous for its memory safety guarantees without needing a garbage collector. At the heart of this system is a concept that's both simple and powerful: Ownership. If you're new to Rust or just beginning to understand how it manages memory, getting familiar with ownership is a crucial first step.

Why Ownership?

In many languages, memory is managed either manually (like in C) or automatically through garbage collection (like in JavaScript or Python). Rust takes a different approach. It manages memory through a set of rules enforced at compile time, and this system revolves around ownership.

The result? You get memory safety, zero-cost abstractions, and predictable performance—all without runtime overhead.

The Core Ownership Rules

  1. Each value in Rust has a variable that's called its owner.
  2. There can only be one owner at a time.
  3. When the owner goes out of scope, the value is dropped.

Let’s walk through a quick example:

fn main() {
    let s = String::from("hello");
    takes_ownership(s);
    // s is no longer valid here
}

fn takes_ownership(some_string: String) {
    println!("{}", some_string);
}
Enter fullscreen mode Exit fullscreen mode

In the above code, the takes_ownership function takes ownership of the String. After this, the original s is no longer valid. If you try to use it after the function call, the compiler will throw an error.

This might seem restrictive at first, but it's the compiler helping you avoid bugs like double frees, use-after-free, or memory leaks.

Borrowing: Sharing Without Owning

Sometimes, you just want to look at some data without taking ownership of it. That's where borrowing comes in.

Rust allows you to borrow a value using references. There are two kinds of borrows:

  • Immutable borrow (&T) – you can read the value but not modify it.
  • Mutable borrow (&mut T) – you can modify the value, but only one mutable reference can exist at a time.

Example:

fn main() {
    let s = String::from("hello");

    let len = calculate_length(&s); // borrow s immutably
    println!("The length of '{}' is {}.", s, len);
}

fn calculate_length(s: &String) -> usize {
    s.len()
}
Enter fullscreen mode Exit fullscreen mode

Here, calculate_length borrows s instead of taking ownership. That means s is still valid in the main function after the call.

Borrowing helps you write safe and efficient code, avoiding unnecessary copies or moves while maintaining strict rules that prevent data races at compile time.

Slices: Views Into Data

A slice is a reference to a part of a collection, such as an array or a String. Slices themselves do not own the data—they're just a lightweight view.

Example:

fn main() {
    let s = String::from("hello world");
    let hello = &s[0..5];
    let world = &s[6..11];

    println!("{} {}", hello, world);
}
Enter fullscreen mode Exit fullscreen mode

In this example, hello and world are slices of the original String. The original s still owns the memory, but we can use these slices to work with parts of it.

Slices are particularly useful when you want to avoid copying or splitting data but still need to work with subsets.

Conclusion

Rust's ownership system might feel strict at first, especially if you're coming from more permissive languages. But once you internalize the rules, it becomes clear that they're designed to help you write faster, safer, and more efficient code.

Ownership, borrowing, and slices form a trio that empowers you to manage memory without fear—because the compiler has your back.

If you're a software developer who enjoys exploring different technologies and techniques like this one, check out LiveAPI. It’s a super-convenient tool that lets you generate interactive API docs instantly.

LiveAPI helps you discover, understand and use APIs in large tech infrastructures with ease!

So, if you’re working with a codebase that lacks documentation, just use LiveAPI to generate it and save time!

You can instantly try it out here! 🚀

Comments 0 total

    Add comment