Smart Pointer in c++: Weak Pointer

avatar

Ein schwacher Zeiger (Weak Pointer) wird genutzt, um zu Kontrollieren, dass dies der erste Pointer ist der gelöscht werden soll und erst danach die anderen Pointer, wie eine Kaskade. Man bestimmt die Reihenfolge von wo an das löschen beginnen soll. Ein gutes Beispiel sind gegenseitige Abhängigkeiten (A->B und B->A) oder auch Zyklen (A->B->C->A). Ohne die Weak Pointer würde der Referrenzzähler immer größer 1 sein. Das bedeutet, es wird nie etwas gelöscht.

Hier ein kleines Beispiel mit 3 Klassen

#include <iostream>
#include <memory>

class A;
class B;
class C;

class A {
public:
    // modify to std::shared_ptr<B> to see the difference in the counter
    std::weak_ptr<B> pointer;
    virtual ~A(){}
};

class B {
public:
    std::shared_ptr<C> pointer;
    virtual ~B(){}
};

class C {
public:
    std::shared_ptr<A> pointer;
    virtual ~C(){}
};

std::shared_ptr<A> weakPointerDemo(){
    // create a cyclus: A -> B -> C -> A
    auto a = std::make_shared<A>();
    auto b = std::make_shared<B>();
    auto c = std::make_shared<C>();

    a->pointer = b;
    b->pointer = c;
    c->pointer = a;


    std::cout << a.use_count() << "\n";
    return a;
}

int main() {
    auto pointerFromFunction = weakPointerDemo();

    // Because of the cyclus, the shared pointer can not decrement its counter
    // Use a weak pointer in this case to break the cyclus
    std::cout << pointerFromFunction.use_count() << "\n";

    return 0;
}



0
0
0.000
0 comments