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.