Day-6: Understand Ownership, Borrowing, and the Borrow Checker in Rust!

Play this article


One of Rust's defining features is its ownership system, which provides memory safety and eliminates common programming errors like data races and null pointer dereferences. To fully harness the power of Rust, it's essential to understand ownership, borrowing, and the borrow checker. In this article, we will explore these concepts, unravel their significance, and understand how they contribute to Rust's safety guarantees.

Ownership in Rust:

In Rust, every value has a unique owner, and there can only be one owner at a time. Ownership is a responsibility for managing the memory associated with a value. When a value goes out of scope, its memory is automatically freed. This eliminates the need for explicit memory deallocation or garbage collection.

Consider the following example:

fn main() {
    let name = String::from("Alice");
    println!("Hello, {}!", name);

In the example above, a String value is created and assigned to the name variable. The String type represents a string stored in the heap, which allows it to be flexible in size. When name goes out of scope, Rust automatically frees the memory associated with the string.

Borrowing in Rust:

Borrowing is a mechanism in Rust that allows multiple references to a value without transferring ownership. With borrowing, we can pass references to values to functions or assign them to other variables.

Let's see an example:

fn print_length(s: &String) {
    println!("Length: {}", s.len());

fn main() {
    let name = String::from("Bob");

In the example above, the print_length the function takes a reference to a String as its parameter, denoted by &String. This allows the function to access the value without taking ownership. We pass a reference to the name variable using the & symbol.

The Borrow Checker:

The borrow checker is a part of the Rust compiler that analyzes code to ensure that borrowing rules are followed. It enforces rules to prevent data races and other memory-related bugs.

The borrow checker checks three key rules:

  1. One mutable reference or multiple immutable references: You can have either one mutable reference to a value or any number of immutable references to a value in a particular scope. This prevents data races by disallowing simultaneous mutable and immutable access.

  2. References must be valid: The borrow checker ensures that references are always valid and don't outlive the value they reference. This prevents the use of dangling references, which can lead to memory safety issues.

  3. No use after a move: Once ownership of a value is transferred, the previous variable holding the value cannot be used. This prevents the accidental use of invalidated references.

By enforcing these rules, the borrow checker guarantees memory safety without the need for a garbage collector or runtime overhead.


Understanding ownership, borrowing, and the borrow checker is fundamental to writing safe and efficient Rust code. Ownership ensures memory safety by managing the lifetime of values, while borrowing allows temporary access to values without transferring ownership. The borrow checker enforces rules to prevent data races and memory-related bugs.

By embracing these concepts, you can write Rust code that is not only robust but also performs well. Rust's ownership system sets it apart from other programming languages and empowers developers to create reliable and efficient software.

Continue exploring Rust's ownership model, borrowing, and the borrow checker, and leverage the language's safety guarantees to build high-quality applications. Happy coding in Rust!

I hope this helps, you!!

More such articles:


If this article adds any value to you then please clap and comment.

Let’s connect on Stackoverflow, LinkedIn, & Twitter.

Did you find this article valuable?

Support techwasti by becoming a sponsor. Any amount is appreciated!