Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

H5::

Treue Seele

Beiträge: 368

Wohnort: Kiel

  • Private Nachricht senden

11

02.11.2013, 03:46

Um zirkuläre Abhängigkeiten zu durchbrechen und Referenzen auf std::shared_ptr zu halten dienen std::weak_ptr sofern man std::shared_ptr benutzen möchte. Diese erleichtern auch ein bisschen das Arbeiten mit Verkettungen.
:love: := Go;

12

02.11.2013, 10:40

Also ich mag shared_ptr nicht besonders. Ich benutze unique_ptr, wenn ein Objekt ein Objekt ein anderes besitzt bzw. verwaltet und normale Pointer, wenn ich nur eine Referenz darauf will.

Klassisches Beispiel für shared_ptr: Ressourcen (Texturen, 3D-Modelle, ...), die von mehreren Objekten benutzt werden und erst dann gelöscht werden dürfen, wenn sie von keinem mehr benötigt werden.

Ja schon, nur die Frage ist, woher man die Ressourcen dann bekommt? Wenn sie von einem zentralen Manager kommen, muss der auch in irgendeiner Form eine Referenz darauf haben, und somit auch darüber benachrichtigt werden, wenn eine Ressource endgültig nicht mehr benötigt wird.


Noch eine Frage: Kann ich statt unique_ptrs auch shared_ptrs verwenden? Besonders weil die Nodes evtl. kopiert werden müssen.

Aus welchem Grund könnte es Sinn ergeben, Nodes zu kopieren? In C++11 gibt es jetzt Move-Semantik, die von unique_ptr voll unterstützt ist und wirklich sehr sehr elegant ist.

Letztendlich funktioniert meiner Meinung nach RAII erst durch uniqu_ptr / move-Semantik wirklich, ist damit aber um Längen effizienter und robuster als jeder Garbage-Collector der Welt. Beherzigt man es konsequent, muss man sich um Memory-Leaks keine Gedanken mehr machen. Der Preis ist, dass man sich über sein Programm Gedanken machen muss, man muss also beim Programmieren auch mitdenken.
Lieber dumm fragen, als dumm bleiben!

13

02.11.2013, 14:07

@David: Für Ressourcen habe ich extra eine eigene Klasse ResHandle eingebaut. Die besitzt einen Referenzzähler, und funktioniert einwandfrei.
@Jonathan_Klein: Die Ressourcen habe ich bei mir so verwaltet, dass der ResourceManager eine Liste mit Handles besitzt. Diese Handles können kopiert werden, wodurch der Referenzzähler um eins erhöht wird. Den Zeiger auf die Ressource speichert auch das Handle. Falls ein Handle gelöscht wird, verringert es den Referenzzähler. Sinkt dieser auf 0 löscht es die Ressource auf die der Zeiger zeigt. Die eig. Daten liegen dabei natürlich auf dem Heap. Eine Art smart pointer eben.

@dot: Das war die perfekte Antwort ;). Jetzt ist mir der Unterschied klar, danke dir!

Werbeanzeige