Smart Pointer in c++: Weak Pointer
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