4 Systemy Odporne na Błędy
Transkrypt
4 Systemy Odporne na Błędy
Systemy Odporne na Błędy 2015/2016 Instrukcja laboratoryjna 4 1/2 Systemy Odporne na Błędy Inteligentne wskaźniki w C++ Przygotowali: dr inż. Grzegorz Łukawski, mgr inż. Daniel Kaczmarski 1) Inteligentne wskaźniki Inteligentne wskaźniki (ang. smart pointer) to abstrakcyjny typ danych symulujący wskaźnik, dodając przy tym nowe funkcje takie jak odśmiecanie albo sprawdzanie zakresów odwołań (bounds checking). Niektóre inteligentne wskaźniki wykonują zliczanie referencji (shared_ptr), inne przekazują kontrolę nad obiektem tylko jednemu wskaźnikowi (auto_ptr). W języku C++ inteligentne wskaźniki mogą zostać zaimplementowane jako wzorzec klasy, który dzięki przeciążeniu operatorów, udaje działanie zwykłego wskaźnika (operacje dereferencji, przypisania itp.), definiując dodatkowe algorytmy zarządzania pamięcią. 2) Inteligentne wskaźniki w C++ W przypadku języka C++ deklaracja inteligentnych wskaźników dostępna jest po dołączeniu pliku nagłówkowego #include <memory> Inteligentne wskaźniki są podstawowym sposobem opakowania zwykłych wskaźników w obiekty języka C++: unique_ptr - pozwala na zdefiniowanie dokładnie jednego obiektu opakowującego zwykły wskaźnik. Jest to podstawowy wybór, o ile nie przewiduje się współużywania zwykłego wskaźnika - wtedy stosuje się shared_ptr. Możliwe jest przeniesienie do innego obiektu, ale nie kopiowanie czy współużywanie. Klasa unique_ptr jest mała i efektywna, obiekt ma rozmiar zwykłego wskaźnika. shared_ptr - klasa inteligentnego wskaźnika zliczająca ilość odwołań do niego z różnych miejsc programu. Używa się jej gdy zwykły wskaźnik musi być widoczny z wielu miejsc w kodzie, na przykład gdy zwraca się kopię wskaźnika z pojemnika, ale należy zachować oryginał. Zwykły wskaźnik nie jest usuwany do momentu, gdy wszystkie zawierające go obiekty typu shared_ptr zostaną usunięte lub przekażą swoją zawartość. Rozmiar jest równy rozmiarowi dwu Systemy Odporne na Błędy 2015/2016 2/2 wskaźników; jeden do obiektu, drugi do wspólnego bloku kontrolnego, który przechowuje ilość odwołań. weak_ptr - specjalny rodzaj używany łącznie z klasą shared_ptr. Zapewnia dostęp do obiektu identyfikowanego przez jeden lub więcej obiektów shared_ptr , bez związku z ilością odwołań. Używany gdy należy obserwować obiekt, ale nie wpływać na jego istnienie. 3) Przykład #include <iostream> #include <memory> namespace std::weak_ptr<int> wp; void f() { if(auto spt = wp.lock()) std::cout << *spt << "\n"; else std::cout << "wp jest nieaktualny\n"; } int main() { // specjane wymuszenie zmiany zakresu { auto sp = std::make_shared<int>(42); wp = sp; f(); } f(); } 4) Zadanie do wykonania Napisz program, który stworzy serie rekordów, a następnie usunie losowo wybrany ze sprawdzaniem zajętej pamięci.