std::weak_ptr<>

Teil 1 von 5 der Serie STL Rezepte Sammlung

Wie soll man in einem Thread auf einen Zeiger zugreifen, der in einem anderen Thread generiert wurde. Der Zeiger alleine gibt uns keine Information darüber ob er gültig ist. Wegen Architektur des Speicher-Managements können wir auch nicht einfach mal reinschauen und den Inhalt prüfen. Zugriffsschutzverletzung ist das Stichwort.

Ein std::weak_ptr enthält einen nicht-besitzenden (schwachen) Verweis auf ein Objekt das von einem std::shared_ptr verwaltet wird. Um auf das Objekt zugreifen zu können, muss es in einen besitzenden std::smart_ptr konvertiert werden. Eine erfolgreiche Konvertierung bedeutet, dass das Objekt noch gültig ist.

#include <memory>

void access(std::weak_ptr<const char*> ptr)
{
    auto clone = ptr.lock(); // konvertieren
    if (clone)
    {
        fprintf(stderr, "%s\n", *clone);
    }
    else
    {
        fprintf(stderr, "ptr ist leer\n");
    }
}

int main()
{
    std::weak_ptr<const char*> ptr; 
    access(ptr);
    {
        auto shared = std::make_shared<const char*>("hallo");
        ptr = shared;
        access(ptr);
    }
    access(ptr);
}
Series Navigationstd::copy_if<> >>