153 lines
9.4 KiB
HTML
153 lines
9.4 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="de">
|
|
<head>
|
|
<link rel="icon" type="image/svg+xml" href="../../../assets/favicon.svg">
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>Rust 12: Smart Pointer & 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 & Smart Pointer</div>
|
|
<h1>Rust 12: Smart Pointer (Box, Rc, RefCell)</h1>
|
|
<p>Verstehe Heapspeicher mit <code>Box<T></code>, Reference Counting mit <code>Rc<T></code>, Interior Mutability mit <code>RefCell<T></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<T>] ──> Eindeutiger Besitz (Single Owner) auf dem Heap. Für rekursive Typen.<br>
|
|
[Rc<T>] ──> Geteilter Besitz (Multiple Owners, Single-Threaded) via Reference Counter.<br>
|
|
[RefCell<T>] ──> Interior Mutability: Borrow-Checking dynamisch zur Laufzeit.<br>
|
|
[Rc<RefCell<T>>] ──> 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<T></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<T></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<T></code></strong>
|
|
<p style="font-size: 0.85rem; margin-top: 4px; color: var(--text-body);"><code>borrow()</code> (&T) und <code>borrow_mut()</code> (&mut T) prüfen Regeln zur Laufzeit.</p>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- 2. THEORIE: INTERIOR MUTABILITY & DROP -->
|
|
<section class="card">
|
|
<h2>🛡️ 2. Interior Mutability & 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(&shared_data);
|
|
let handle2 = Rc::clone(&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(&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<T></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<T></code></td>
|
|
<td style="padding: 10px;">Multiple Owners</td>
|
|
<td style="padding: 10px;">Unveränderlich (&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<T></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<Mutex<T>></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 & 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<TreeNode></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<RefCell<i32>></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 →</a>
|
|
<a href="../11_iteratoren_und_closures/index.html" class="btn btn-secondary">← 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 →</a>
|
|
</div>
|
|
</section>
|
|
</main>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|