C++ von den Grundlagen bis zum Profi — Folge 9
Besitzverhältnisse mit Smart Pointern ausdrücken
Die in diesem Blog verfassten Artikel wurden mit dem Ziel erstellt, zu unterrichten. Außerdem können die Informationen im Artikel falsch sein, also seien Sie bitte vorsichtig.
Die Verwendung von Zeigern verursacht keine Probleme. Das Problem entsteht, wenn Rohzeiger als Eigentümer verwendet werden, ohne zu wissen, wer das Objekt zerstören soll.
Intelligente Zeiger drücken den Besitz als Typ aus.
unique_ptr
std::unique_ptrist alleiniger Eigentümer.
#include <memory>
auto warrior = std::make_unique<Warrior>("Rose");
std::cout << warrior->Attack() << '\n';
Ohne direkt neu anzurufenstd::make_uniqueErstellen Sie ein Objekt mit Wenn unique_ptr den Gültigkeitsbereich verlässt, wird das besitzende Objekt automatisch zerstört.
Da es alleiniges Eigentum ist, kann es nicht kopiert, aber verschoben werden.
std::vector<std::unique_ptr<Character>> party;
auto warrior = std::make_unique<Warrior>("Rose");
party.push_back(std::move(warrior));
std::moveDanach wird der Krieger leer und der Besitz geht auf den Vektor über. std::move selbst dient dazu, es als beweglichen Wert und nicht als Funktion zum Bewegen von Objekten zu behandeln.
shared_ptr
Möglicherweise muss ein einzelnes Monster sowohl der aktiven Liste als auch dem Kampfsystem gehören. Zu diesem Zeitpunktstd::shared_ptrverwendet werden kann.
auto monster = std::make_shared<Monster>(1, "Slime", 30);
std::vector<std::shared_ptr<Monster>> activeMonsters;
std::queue<std::shared_ptr<Monster>> spawnQueue;
spawnQueue.push(monster);
activeMonsters.push_back(monster);
Beim Kopieren von shared_ptr wird das Objekt nicht kopiert, aber sein Referenzzähler wird erhöht. Das eigentliche Objekt wird zerstört, wenn sein letzter Besitzer verschwindet.
Es ist aus Bequemlichkeitsgründen keine gute Idee, alle Zeiger auf shared_ptr zu setzen. Es wird unklar, wem es gehört, es kann zu Zirkelverweisen kommen und es fallen Kosten für die Verwaltung der Referenzanzahl an.
weak_ptr
Wenn Sie ein Objekt wie das aktuelle Ziel nicht besitzen und es nur beobachten möchten,std::weak_ptrVerwenden .
std::weak_ptr<Monster> currentTarget;
currentTarget = monster;
if (auto target = currentTarget.lock())
{
std::cout << target->GetHealth() << '\n';
}
schwachptr verlängert nicht die Lebensdauer eines Objekts. Wenn das Ziel lebtlock()Gibt diesen sharedptr zurück, oder, falls er bereits zerstört wurde, einen leeren shared_ptr.
Zusammenfassend lässt sich sagen, dass, wenn es nur einen Besitzer gibt, uniqueptr, Wenn mehrere Systeme wirklich Sharedptr besitzen müssen, Wenn Sie es nur ansehen, ohne es zu besitzen, ist es schwacher_ptr.
Wenn der Besitz im Code offengelegt wird, bleibt weniger Zeit, sich Gedanken darüber zu machen, wann der Löschvorgang erfolgen soll.