it-praxisportal/courses/rust/12_smart_pointer_und_speichersicherheit/index.html

152 lines
9.4 KiB
HTML

<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Rust 12: Smart Pointer &amp; Speichersicherheit</title>
<link rel="stylesheet" href="../../../assets/style.css">
</head>
<body>
<div class="app-layout">
<div class="app-main">
<header>
<div class="header-container">
<div class="header-badge">⚡ Lehrpfad 3: Traits, Generics &amp; Smart Pointer</div>
<h1>Rust 12: Smart Pointer (Box, Rc, RefCell)</h1>
<p>Verstehe Heapspeicher mit <code>Box&lt;T&gt;</code>, Reference Counting mit <code>Rc&lt;T&gt;</code>, Interior Mutability mit <code>RefCell&lt;T&gt;</code> und deterministisches RAII-Cleanup mit <code>Drop</code>.</p>
</div>
</header>
<main class="container">
<!-- 📂 Schnellzugriff & Download -->
<div style="background: #ffffff; border: 1px solid var(--border-color); border-radius: var(--radius-md); padding: 14px 20px; margin-bottom: 25px; display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 12px; box-shadow: var(--shadow-sm);">
<div style="font-weight: 700; color: var(--text-main); display: flex; align-items: center; gap: 8px;">
<span>📂 Dateien dieser Lerneinheit:</span>
</div>
<div style="display: flex; gap: 10px; flex-wrap: wrap;">
<a href="aufgabe.rs" class="btn" style="padding: 6px 14px; font-size: 0.88rem; background: var(--primary);" download>📄 aufgabe.rs (Startercode)</a>
<a href="test_aufgabe.rs" class="btn btn-secondary" style="padding: 6px 14px; font-size: 0.88rem;" download>🧪 test_aufgabe.rs (Tests)</a>
<a href="musterloesung.rs" class="btn btn-secondary" style="padding: 6px 14px; font-size: 0.88rem;" download>💡 musterloesung.rs (Lösung)</a>
<a href="README.md" class="btn btn-secondary" style="padding: 6px 14px; font-size: 0.88rem;">📖 README.md</a>
</div>
</div>
<!-- 1. THEORIE: SMART POINTER MATRIX -->
<section class="card">
<h2>⚡ 1. Die Smart-Pointer Übersicht</h2>
<p>
Smart Pointer sind Datenstrukturen, die sich wie Referenzen verhalten (über das <code>Deref</code>-Trait), jedoch zusätzliche Metadaten und Garantien bereitstellen.
</p>
<!-- Smart Pointer Matrix -->
<div style="background: var(--bg-subtle); padding: 18px; border-radius: var(--radius-sm); font-family: var(--font-mono); font-size: 0.85rem; line-height: 1.5; margin: 16px 0; border: 1px solid var(--border-color);">
[Box&lt;T&gt;]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;──&gt; Eindeutiger Besitz (Single Owner) auf dem Heap. Für rekursive Typen.<br>
[Rc&lt;T&gt;]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;──&gt; Geteilter Besitz (Multiple Owners, Single-Threaded) via Reference Counter.<br>
[RefCell&lt;T&gt;]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;──&gt; Interior Mutability: Borrow-Checking dynamisch zur Laufzeit.<br>
[Rc&lt;RefCell&lt;T&gt;&gt;]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;──&gt; Mehrere Besitzer, die gemeinsam mutable Daten verändern können!
</div>
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 12px; margin: 16px 0;">
<div style="background: #eff6ff; border-left: 4px solid #3b82f6; padding: 12px; border-radius: var(--radius-sm);">
<strong style="color: #1d4ed8;">1. <code>Box&lt;T&gt;</code></strong>
<p style="font-size: 0.85rem; margin-top: 4px; color: var(--text-body);">Ermöglicht Typen mit dynamischer oder rekursiver Größe wie Binärbäume.</p>
</div>
<div style="background: #f0fdf4; border-left: 4px solid #10b981; padding: 12px; border-radius: var(--radius-sm);">
<strong style="color: #15803d;">2. <code>Rc&lt;T&gt;</code></strong>
<p style="font-size: 0.85rem; margin-top: 4px; color: var(--text-body);">Zählt aktive Referenzen. Wenn <code>strong_count == 0</code> wird der Speicher freigegeben.</p>
</div>
<div style="background: #fdf4ff; border-left: 4px solid #a855f7; padding: 12px; border-radius: var(--radius-sm);">
<strong style="color: #7e22ce;">3. <code>RefCell&lt;T&gt;</code></strong>
<p style="font-size: 0.85rem; margin-top: 4px; color: var(--text-body);"><code>borrow()</code> (&amp;T) und <code>borrow_mut()</code> (&amp;mut T) prüfen Regeln zur Laufzeit.</p>
</div>
</div>
</section>
<!-- 2. THEORIE: INTERIOR MUTABILITY & DROP -->
<section class="card">
<h2>🛡️ 2. Interior Mutability &amp; RAII Drop</h2>
<pre><code>use std::rc::Rc;
use std::cell::RefCell;
// Shared Mutable State:
let shared_data = Rc::new(RefCell::new(vec![1, 2, 3]));
let handle1 = Rc::clone(&amp;shared_data);
let handle2 = Rc::clone(&amp;shared_data);
handle1.borrow_mut().push(4);
handle2.borrow_mut().push(5);
println!("Daten: {:?}", shared_data.borrow()); // [1, 2, 3, 4, 5]
println!("Aktive Handles: {}", Rc::strong_count(&amp;shared_data)); // 3</code></pre>
</section>
<!-- 3. CHEAT-SHEET -->
<section class="card">
<h2>📑 3. Cheat-Sheet: Smart Pointer Vergleich</h2>
<div style="overflow-x: auto;">
<table style="width: 100%; border-collapse: collapse; font-size: 0.9rem; text-align: left;">
<thead>
<tr style="border-bottom: 2px solid var(--border-color); background: var(--bg-subtle);">
<th style="padding: 10px;">Typ</th>
<th style="padding: 10px;">Besitz (Ownership)</th>
<th style="padding: 10px;">Mutabilität</th>
<th style="padding: 10px;">Thread-Sicherheit</th>
</tr>
</thead>
<tbody>
<tr style="border-bottom: 1px solid var(--border-color);">
<td style="padding: 10px;"><code>Box&lt;T&gt;</code></td>
<td style="padding: 10px;">Single Owner</td>
<td style="padding: 10px;">Statisch (Compile-Zeit)</td>
<td style="padding: 10px;">Ja (wenn T: Send)</td>
</tr>
<tr style="border-bottom: 1px solid var(--border-color);">
<td style="padding: 10px;"><code>Rc&lt;T&gt;</code></td>
<td style="padding: 10px;">Multiple Owners</td>
<td style="padding: 10px;">Unveränderlich (&amp;T)</td>
<td style="padding: 10px;">Nein (Single-Thread)</td>
</tr>
<tr style="border-bottom: 1px solid var(--border-color);">
<td style="padding: 10px;"><code>RefCell&lt;T&gt;</code></td>
<td style="padding: 10px;">Single Owner</td>
<td style="padding: 10px;">Dynamisch (Laufzeit-Check)</td>
<td style="padding: 10px;">Nein (Single-Thread)</td>
</tr>
<tr>
<td style="padding: 10px;"><code>Arc&lt;Mutex&lt;T&gt;&gt;</code></td>
<td style="padding: 10px;">Multiple Owners</td>
<td style="padding: 10px;">Thread-sicher mutierbar</td>
<td style="padding: 10px;">Ja (Multi-Thread, ab Modul 14!)</td>
</tr>
</tbody>
</table>
</div>
</section>
<!-- 4. AUFGABEN CHECKLISTE -->
<section class="card">
<h2>🎯 Aufgaben &amp; Checkliste in <code>aufgabe.rs</code></h2>
<div class="task-item">
<input type="checkbox" class="task-checkbox" id="t1">
<label class="task-label" for="t1"><strong>TODO 1:</strong> Rekursiven Binärbaum <code>TreeNode</code> mit <code>Box&lt;TreeNode&gt;</code>, <code>insert</code>, <code>contains</code> und <code>sum</code> implementieren.</label>
</div>
<div class="task-item">
<input type="checkbox" class="task-checkbox" id="t2">
<label class="task-label" for="t2"><strong>TODO 2:</strong> <code>SharedCounter</code> mit <code>Rc&lt;RefCell&lt;i32&gt;&gt;</code>, <code>clone_handle</code>, <code>increment</code> und <code>get</code> erstellen.</label>
</div>
<div class="task-item">
<input type="checkbox" class="task-checkbox" id="t3">
<label class="task-label" for="t3"><strong>TODO 3:</strong> <code>MockResource</code> mit <code>Drop</code> Trait zur deterministischen Freigabeprotokollierung umsetzen.</label>
</div>
<div style="margin-top: 25px; display: flex; gap: 12px; flex-wrap: wrap;">
<a href="../../../workspace.html?course=rust&track=track_3_traits_generics&chapter=12_smart_pointer_und_speichersicherheit" class="btn" style="background: #e43717; color: #fff; font-weight: 700;">💻 In Web-IDE öffnen &rarr;</a>
<a href="../11_iteratoren_und_closures/index.html" class="btn btn-secondary">&larr; Zurück zu Rust 11</a>
<a href="../13_fearless_concurrency_threads_und_channels/index.html" class="btn" style="background: #059669; color: white; font-weight: 700;">Zu Lehrpfad 4: Concurrency &rarr;</a>
</div>
</section>
</main>
</div>
</div>
</body>
</html>