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

1

01.11.2013, 20:02

std::shared_ptr - Destruktor Fehler

Liebe Community,

ich habe einen einfachen SzenenGraphen geschrieben, der std::shared_ptr verwendet, um die einzelnen SceneNodes aufzubewahren. Beim Schließen der Engine allerdings bekomme ich immer einen Fehler, der besagt, dass ein Fehler beim Schreiben an irgendeiner Position aufgetreten ist. Dieser Fehler tritt in dem Moment auf, als der std::shared_ptr versucht seinen Referenzzähler um eins zu verringern.

Ich habe ehrlich gesagt keine Ahnung, wo ich jetzt suchen soll....

Liebe Grüße,
~ EuadeLuxe

2

01.11.2013, 20:09

Idealerweise suchst Du im Quelltext (Wink mit dem Scheunentor). ;)

Zitat

Ich bin nicht der Messias.
Ich sage, du bist es, Herr. Und ich muss es wissen, denn ich bin schon einigen gefolgt.

https://bitbucket.org/bwbg

3

01.11.2013, 20:10

Im Stapelrahmen. :)
Warum eigentlich shared_ptr?

MfG
Check

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Checkmateing« (01.11.2013, 20:15)


4

01.11.2013, 21:32

@Checkmateing: shared_ptr, weil die SceneNodes Child-Nodes aufnehmen können, und ihre Parent-Node speichern sollen. Allerdings soll deswegen nicht jede Node mehrfach benutzt werden, und ich kann keine Referenz nutzen, weil ich die Nodes nicht direkt im Konstruktor einordnen möchte. Den Stapelrahmen (im Debugger) habe ich natürlich durchsucht. Das Einzige sinnvolle da drin, ist aber nur, dass der Fehler nach dem Aufruf des Destruktors des shared_ptrs auftritt.

@bwbg: Das habe ich schon, nur weiß ich nicht recht, was den Fehler bei einer Verringerung des Referenzzählers auslösen könnte....

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

01.11.2013, 21:42

Ich hoffe doch sehr, dass nicht deine Child Nodes shared_ptr auf ihre Parents halten, denn ansonsten hast du eine zirkuläre Abhängigkeit erzeugt und der Speicher wird niemals mehr freigegeben...

[...] und ich kann keine Referenz nutzen, weil ich die Nodes nicht direkt im Konstruktor einordnen möchte.

Wieso? Selbst wenn: Wieso dann nicht eben einfach ein Pointer? Ich seh jedenfalls keinen Grund, hier shared_ptr zu benutzen. Wieso kein unique_ptr?

6

01.11.2013, 21:56


[...]
@bwbg: Das habe ich schon, nur weiß ich nicht recht, was den Fehler bei einer Verringerung des Referenzzählers auslösen könnte....


Ich meinte damit, dass Du uns freundlicherweise den relevanten Quelltext zur Verfügung stellst. Das Scheunentor war wohl nicht groß genug.

Gehe ich davon aus, dass die Elternknoten ihre Kinder besitzen, dann dürfen die Kinder keine shared_ptr auf ihre Eltern besitzen. shared_ptr zeigen immer den Besitz an. Hier wäre maximal ein weak_ptr sinnvoll. Oder Du verzichtest ganz auf die Referenz auf die Eltern und reichst diese als Funktionsparamenter bei der Verwendung mit durch. Hier ist dann der unique_ptr angesagt.

Grüße ... bwbg

Zitat

Ich bin nicht der Messias.
Ich sage, du bist es, Herr. Und ich muss es wissen, denn ich bin schon einigen gefolgt.

https://bitbucket.org/bwbg

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

01.11.2013, 22:05

Die Diskussion hatten wir doch erst letztens mit wem anders...
Jedes Parent hat unique_ptr auf seine Children. Die Children haben einen raw-Pointer auf das Parent.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

8

01.11.2013, 23:28

Danke euch, ihr hattet recht! Ich hab überhaupt nicht mehr daran gedacht, dass auch durch shared_ptrs in gewisser Weise Abhängigkeiten erzeugt werden. Ich habe den Parent-Zeiger zu einem einfachen Zeiger umgewandelt und siehe da: es geht. Da werde ich mich nochmal über die neuen Zeiger setzen müssen, und pauken müssen. Vielen lieben Dank!
Noch eine Frage: Kann ich statt unique_ptrs auch shared_ptrs verwenden? Besonders weil die Nodes evtl. kopiert werden müssen.

Liebe Grüße, und nochmal danke,
~ EuadeLuxe ~

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

02.11.2013, 00:25

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

Natürlich kannst du. Die Frage ist, ob es auch gut ist. Kann ein Node mehrere Besitzer haben? Wenn ja: Warum? Wenn nicht, dann ist shared_ptr absolut fehl am Platz.

shared_ptr ⇔ mehrere Besitzer
unique_ptr ⇔ genau ein Besitzer

;)

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

10

02.11.2013, 01:09

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.

Werbeanzeige