EPC úloha 1: vektor s oddělenou alokací
Konec 12. týdne semestru, podle kalendáře neděle 13. 12. 2026. Původní termín na konci 4. cvičení je v zadání přeškrtnutý. Datum si ověř. Úloha je za 10 bodů a soupis obsahuje body k pochopení, ne řešení.
Co máš odevzdat
Třídní šablonu epc::vector<T> s rozhraním ze zadání. Oproti cvičné 0. úloze nesmí T potřebovat výchozí konstruktor ani (kromě kopírovacího přiřazení vektoru) přiřazení.
Co musíš pochopit
- Kapacita a velikost. V úložišti existuje jen
size()objektů. - Čtyři mechanizmy ze zadání:
operator new, placement new, volání destruktoru,operator delete. - Strong exception guarantee u
reserveapush_back: po výjimce je vektor úplně beze změny. - Pořadí kroků realokace: nové úložiště, kopie, zrušení starých prvků, dealokace, přenastavení proměnných.
- Self-assignment a zbytečná alokace u kopírovacího přiřazení. Alokovat smíš jen tehdy, když je to nutné.
Co si zopakovat
| Co | Kde |
|---|---|
| Oddělené vytvoření objektu | kapitola Objekty a úložiště, ni_epc_02 strany 28–31 |
uninitialized_copy a výjimky |
ni_epc_03 strany 13–17 |
| Kopírovací konstruktor vektoru | ni_epc_04 strany 43–48 |
| Záruky výjimek | kapitola Výjimky a RAII, ni_epc_10 strany 9–12 |
| Chyba v kopírovacím konstruktoru | cvičení 3, úloha 3 |
Zbytečné větvení v push_back |
cvičení 3, úloha 4 |
Doporučené pořadí
- Rozhraní a prázdné tělo, ať projde překlad.
- Konstruktor, destruktor,
capacity,size,data,operator[]. reserve. Na něm stojí zbytek.push_backs pravidlem růstu 0 → 1 → 2 → 4.pop_back,clear.- Kopírovací konstruktor.
swap.- Kopírovací přiřazení.
- Testy výjimek a sanitizery.
Na co si dát pozor
data()prázdného vektoru s nulovou kapacitou vrací nulový ukazatel.- Výchozí konstruktor nesmí alokovat a je
noexcept. clearapop_backnemění kapacitu.v.push_back(v[0])s realokací: argument leží ve starém úložišti. Nový prvek musí vzniknout dřív, než staré úložiště zanikne. Nepíše to zadání výslovně, ale strong garance a běžné použití to vyžadují.- Výjimka uprostřed kopírování prvků nesmí nechat únik paměti.
Jak testovat
Testovací typy si napiš sám, zachytí většinu chyb:
- typ bez výchozího konstruktoru
- typ s počítadlem živých objektů (na konci musí být 0)
- typ, jehož kopie vyhodí výjimku na -té kopii
Překládej s -fsanitize=address,undefined.
Kontrola před odevzdáním
-
reserve(3)bez prvků nevytvoří žádný objekt. - Testy projdou s typem bez výchozího konstruktoru.
- Po výjimce v
push_backje vektor beze změny a nic neuniklo. -
v = vfunguje. - Kopírovací přiřazení nealokuje, když se obsah vejde.
- Sanitizery nic nehlásí.
- Ověřil jsem termín a způsob odevzdání.