From 7a08390e01554784b535834f00046fff1d8e2dc4 Mon Sep 17 00:00:00 2001 From: Lukas Mueller <3017761@stud.hs-mannheim.de> Date: Thu, 28 May 2026 18:53:06 +0200 Subject: [PATCH] =?UTF-8?q?Ownership=20und=20Borrowing=20hinzugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- D-ownership/TODO | 0 .../01-motivation/memory_leak.cpp | 19 +++++++++++++++++ .../example-code/02-ownership/function.rs | 21 +++++++++++++++++++ .../example-code/02-ownership/memory-leak.cpp | 8 +++++++ .../example-code/02-ownership/memory-leak.rs | 6 ++++++ .../02-ownership/mutable-string.rs | 7 +++++++ .../02-ownership/return-values.rs | 16 ++++++++++++++ .../example-code/02-ownership/scope.rs | 8 +++++++ .../03-borrowing/combination-references.rs | 9 ++++++++ .../03-borrowing/dangling-reference-fixed.rs | 9 ++++++++ .../03-borrowing/dangling-reference.cpp | 9 ++++++++ .../03-borrowing/dangling-reference.rs | 9 ++++++++ .../03-borrowing/multiple-mut-references.rs | 8 +++++++ .../03-borrowing/mutate-reference.rs | 9 ++++++++ .../example-code/03-borrowing/reference.rs | 11 ++++++++++ .../scoped-multiple-references.rs | 9 ++++++++ D-ownership/live-coding/Cargo.toml | 6 ++++++ D-ownership/live-coding/src/main.rs | 3 +++ README.md | 7 +++++-- 19 files changed, 172 insertions(+), 2 deletions(-) delete mode 100644 D-ownership/TODO create mode 100644 D-ownership/example-code/01-motivation/memory_leak.cpp create mode 100644 D-ownership/example-code/02-ownership/function.rs create mode 100644 D-ownership/example-code/02-ownership/memory-leak.cpp create mode 100644 D-ownership/example-code/02-ownership/memory-leak.rs create mode 100644 D-ownership/example-code/02-ownership/mutable-string.rs create mode 100644 D-ownership/example-code/02-ownership/return-values.rs create mode 100644 D-ownership/example-code/02-ownership/scope.rs create mode 100644 D-ownership/example-code/03-borrowing/combination-references.rs create mode 100644 D-ownership/example-code/03-borrowing/dangling-reference-fixed.rs create mode 100644 D-ownership/example-code/03-borrowing/dangling-reference.cpp create mode 100644 D-ownership/example-code/03-borrowing/dangling-reference.rs create mode 100644 D-ownership/example-code/03-borrowing/multiple-mut-references.rs create mode 100644 D-ownership/example-code/03-borrowing/mutate-reference.rs create mode 100644 D-ownership/example-code/03-borrowing/reference.rs create mode 100644 D-ownership/example-code/03-borrowing/scoped-multiple-references.rs create mode 100644 D-ownership/live-coding/Cargo.toml create mode 100644 D-ownership/live-coding/src/main.rs diff --git a/D-ownership/TODO b/D-ownership/TODO deleted file mode 100644 index e69de29..0000000 diff --git a/D-ownership/example-code/01-motivation/memory_leak.cpp b/D-ownership/example-code/01-motivation/memory_leak.cpp new file mode 100644 index 0000000..f336f5d --- /dev/null +++ b/D-ownership/example-code/01-motivation/memory_leak.cpp @@ -0,0 +1,19 @@ +#include + +int main() { + // Allocating memory on the heap + int* myPointer = new int(42); + std::cout << "myPointer at address " + << myPointer << " is equal to " << *myPointer << std::endl; + + // Allocating memory on the heap + myPointer = new int(10); + std::cout << "myPointer at address " + << myPointer << " is equal to " << *myPointer << std::endl; + + delete myPointer; + + return 0; +} + + diff --git a/D-ownership/example-code/02-ownership/function.rs b/D-ownership/example-code/02-ownership/function.rs new file mode 100644 index 0000000..f00ea54 --- /dev/null +++ b/D-ownership/example-code/02-ownership/function.rs @@ -0,0 +1,21 @@ +fn main() { + let s = String::from("String"); + + takes_ownership(s); + + let x = 5; + + makes_copy(x); + + println!("{x}"); + + println!("{s}"); +} + +fn takes_ownership(some_string: String) { + println!("{some_string}"); +} + +fn makes_copy(number: i32) { + println!("{number}"); +} diff --git a/D-ownership/example-code/02-ownership/memory-leak.cpp b/D-ownership/example-code/02-ownership/memory-leak.cpp new file mode 100644 index 0000000..dc251f6 --- /dev/null +++ b/D-ownership/example-code/02-ownership/memory-leak.cpp @@ -0,0 +1,8 @@ +#include + +int main() { + char* ptr1 = new char[5]{'h', 'e', 'l', 'l', 'o'}; + char* ptr2 = ptr1; + + std::cout << ptr1 << std::endl; +} // Memory leak since nothing is released! diff --git a/D-ownership/example-code/02-ownership/memory-leak.rs b/D-ownership/example-code/02-ownership/memory-leak.rs new file mode 100644 index 0000000..48cb49c --- /dev/null +++ b/D-ownership/example-code/02-ownership/memory-leak.rs @@ -0,0 +1,6 @@ +fn main() { + let s1 = String::from("hello"); + let s2 = s1; + + println!("{s1}, world!"); +} diff --git a/D-ownership/example-code/02-ownership/mutable-string.rs b/D-ownership/example-code/02-ownership/mutable-string.rs new file mode 100644 index 0000000..4b68d67 --- /dev/null +++ b/D-ownership/example-code/02-ownership/mutable-string.rs @@ -0,0 +1,7 @@ +fn main() { + let mut s1 = String::from("hello"); + + s1.push_str(", world!"); // appending the literal to s + + println!("{s1}"); // this will print `hello, world!` +} diff --git a/D-ownership/example-code/02-ownership/return-values.rs b/D-ownership/example-code/02-ownership/return-values.rs new file mode 100644 index 0000000..6594002 --- /dev/null +++ b/D-ownership/example-code/02-ownership/return-values.rs @@ -0,0 +1,16 @@ +fn main() { + let s1 = get_ownership(); + + let s2 = String::from("hello"); + + let s3 = take_and_get_ownership(s2); +} + +fn get_ownership() -> String { + let s = String::from("yours"); + s +} + +fn take_and_get_ownership(some_string: String) -> String { + some_string +} diff --git a/D-ownership/example-code/02-ownership/scope.rs b/D-ownership/example-code/02-ownership/scope.rs new file mode 100644 index 0000000..48114a9 --- /dev/null +++ b/D-ownership/example-code/02-ownership/scope.rs @@ -0,0 +1,8 @@ +fn main() { + // s is not valid here, since it's not yet declared + { + let s = "hello"; // s is valid from this point forward + // do stuff with s + println!("{s}"); + } // s is no longer valid since the scope is over +} diff --git a/D-ownership/example-code/03-borrowing/combination-references.rs b/D-ownership/example-code/03-borrowing/combination-references.rs new file mode 100644 index 0000000..de4d20f --- /dev/null +++ b/D-ownership/example-code/03-borrowing/combination-references.rs @@ -0,0 +1,9 @@ +fn main() { + let mut s = String::from("hello"); + + let r1 = &s; + let r2 = &s; + let r3 = &mut s; + + println!("{r1}, {r2}, and {r3}"); +} diff --git a/D-ownership/example-code/03-borrowing/dangling-reference-fixed.rs b/D-ownership/example-code/03-borrowing/dangling-reference-fixed.rs new file mode 100644 index 0000000..596932d --- /dev/null +++ b/D-ownership/example-code/03-borrowing/dangling-reference-fixed.rs @@ -0,0 +1,9 @@ +fn main() { + let reference_to_nothing = dangle(); +} + +fn dangle() -> String { + let s = String::from("hello"); + + s +} diff --git a/D-ownership/example-code/03-borrowing/dangling-reference.cpp b/D-ownership/example-code/03-borrowing/dangling-reference.cpp new file mode 100644 index 0000000..7aade53 --- /dev/null +++ b/D-ownership/example-code/03-borrowing/dangling-reference.cpp @@ -0,0 +1,9 @@ +#include + +int main() { + int* ptr1 = new int(42); + int* ptr2 = ptr1; + delete ptr1; + + std::cout << "Wert bei " << ptr2 << " ist " << *ptr2 << std::endl; +} diff --git a/D-ownership/example-code/03-borrowing/dangling-reference.rs b/D-ownership/example-code/03-borrowing/dangling-reference.rs new file mode 100644 index 0000000..b102697 --- /dev/null +++ b/D-ownership/example-code/03-borrowing/dangling-reference.rs @@ -0,0 +1,9 @@ +fn main() { + let reference_to_nothing = dangle(); +} + +fn dangle() -> &String { + let s = String::from("hello"); + + &s +} diff --git a/D-ownership/example-code/03-borrowing/multiple-mut-references.rs b/D-ownership/example-code/03-borrowing/multiple-mut-references.rs new file mode 100644 index 0000000..f613588 --- /dev/null +++ b/D-ownership/example-code/03-borrowing/multiple-mut-references.rs @@ -0,0 +1,8 @@ +fn main() { + let mut s = String::from("hello"); + + let r1 = &mut s; + let r2 = &mut s; + + println!("{r1}, {r2}"); +} diff --git a/D-ownership/example-code/03-borrowing/mutate-reference.rs b/D-ownership/example-code/03-borrowing/mutate-reference.rs new file mode 100644 index 0000000..452015a --- /dev/null +++ b/D-ownership/example-code/03-borrowing/mutate-reference.rs @@ -0,0 +1,9 @@ +fn main() { + let s = String::from("hello"); + + change(&s); +} + +fn change(some_string: &String) { + some_string.push_str(", world!"); +} diff --git a/D-ownership/example-code/03-borrowing/reference.rs b/D-ownership/example-code/03-borrowing/reference.rs new file mode 100644 index 0000000..508828b --- /dev/null +++ b/D-ownership/example-code/03-borrowing/reference.rs @@ -0,0 +1,11 @@ +fn main() { + let s1 = String::from("hello"); + + let len = calculate_length(&s1); + + println!("The length of '{s1}' is {len}."); +} + +fn calculate_length(s: &String) -> usize { + s.len() +} diff --git a/D-ownership/example-code/03-borrowing/scoped-multiple-references.rs b/D-ownership/example-code/03-borrowing/scoped-multiple-references.rs new file mode 100644 index 0000000..02904c1 --- /dev/null +++ b/D-ownership/example-code/03-borrowing/scoped-multiple-references.rs @@ -0,0 +1,9 @@ +fn main() { + let mut s = String::from("hello"); + + { + let r1 = &mut s; + } + + let r2 = &mut s; +} diff --git a/D-ownership/live-coding/Cargo.toml b/D-ownership/live-coding/Cargo.toml new file mode 100644 index 0000000..70bf963 --- /dev/null +++ b/D-ownership/live-coding/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "live-coding" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/D-ownership/live-coding/src/main.rs b/D-ownership/live-coding/src/main.rs new file mode 100644 index 0000000..e7a11a9 --- /dev/null +++ b/D-ownership/live-coding/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} diff --git a/README.md b/README.md index 6523b71..bd5ccf1 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ In diesem Repo sind alle Unterlagen für die Präsentation der Programmiersprach Das Repo beinhaltet: - Dockerfile (TODO) - Basics (TODO) -- Ownership und Borrowing (TODO) +- Ownership und Borrowing - Pattern Matching und Enumerationen (TODO) - Testing und Debugging (TODO) @@ -16,6 +16,9 @@ Das Repo beinhaltet: 3. Kontrollstrukturen 4. Types 4. Ownership & Borrowing (Live Coding) (ca. 20 Minuten) + 1. Motivation: Warum Ownership + 2. Prinzip: Ownership + 3. Prinzip: Borrowing 5. Pattern Matching und Enums (Live Coding) (ca. 20 Minuten) 6. Testing und Debugging (ca. 5 Minuten) 7. Anwendungen und interessante Fakten (Nebenläufigkeit, Kernel, usw.) (ca. 10 Minuten) @@ -33,4 +36,4 @@ Das Repo beinhaltet: # Notizen - Cheat Sheet erstellen -- Tests für die Hausaufgabe erstellen \ No newline at end of file +- Tests für die Hausaufgabe erstellen