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

21.06.2013, 20:38

SmartPointer

Hio!
Hätte jemand eine Liste für mich, welche aufzeigt, wann ich am besten welchen SmartPointer benutze?
Dringend wäre z.B. ein SmartPointer, der sich besonders gut eignet, um ihn als Parameter und Rückgabewert zu missbrauchen. - oder eine ganz tolle andere Methode, die mit SmartPointern super kombinierbar wäre.
Danke :S

MfG
Check

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

21.06.2013, 21:01

Das hat mit Parameter und Rückgabewert nicht viel zu tun. Sondern damit, wem ein Objekt gehört.
Gehört es mehreren Eltern-Objekten oder nur einem?

Beispiel:
Mein Auto gehört meiner Freundin und mir. Wir müssen beide tot sein (oder es beide freigeben), damit es niemandem mehr gehört. Meine Hose gehört aber nur mir. Auch wenn meine Freundin die manchmal in die Waschmaschine wirft, nur ich darf die Hose in den Müll werfen. ;)
Genau das ist auch die Entscheidung, die bei Smart-Pointern zu treffen ist. Jeder, dem ein Objekt nicht gehört, es aber braucht (meine Freundin braucht die Hose, damit sie sie waschen kann), bekommt eine "Benutzungserlaubnis", was einem (Raw-)Pointer oder einer Referenz darauf entspricht. Freigeben dürfen aber nur die Owner. Wenn alle Owner das Objekt freigegeben haben, löscht der Smartpointer das Ding. Alle anderen Nutzer müssen natürlich garantiert tot sein bevor die Owner tot sind, sonst greift der Nutzer auf einen gelöschten Pointer zu - hier also nix neues, das war ja schon immer so.

Ein Besitzer: unique_tr
Mehrere: shared_ptr
usw.
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]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

21.06.2013, 21:02

Ist eigentlich ganz einfach: So lange du diese Frage stellen musst, sieht die Liste so aus:
  • std::unique_ptr

;)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

21.06.2013, 21:04

Hehe, dot, sehr gut und sehr wahr.
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]

5

21.06.2013, 21:05

Eh ok war ich doch auf dem richtigen Weg.
Als Parameter/Rückgabewert sind RawPointer aber still the best oder wie ist das am besten mit unique_ptr umsetzbar?

MfG
Check

Databyte

Alter Hase

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

6

21.06.2013, 21:07

Ist eigentlich ganz einfach: So lange du diese Frage stellen musst, sieht die Liste so aus:
  • std::unique_ptr

;)


und std::move ist die methode welche du damit kombinierst.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

21.06.2013, 21:09

Eh ok war ich doch auf dem richtigen Weg.
Als Parameter/Rückgabewert sind RawPointer aber still the best oder wie ist das am besten mit unique_ptr umsetzbar?

MfG
Check

Nein, RawPointer sind nicht das beste. Manchmal müssen eben unique_ptr hin- und hergereicht werden. Da sind raw-Pointer kontraproduktiv. std::move ist hier dein Freund.
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

21.06.2013, 21:10

Ja.

C-/C++-Quelltext

1
2
std::unique_ptr<int> a(new int(5));
std::unique_ptr<int> b = std::move(a);

a wird dadurch ungültig, nicht? ^^

MfG
Check

EDIT: Also wirklich immer mit std::move ein Bein abbrechen? Baahh... Wirkte so umständlich, dass es vom mir als falsch angedacht war, aber anscheinend... ._.
Gut, dann wär alles geklärt, danke! :)

Databyte

Alter Hase

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

9

21.06.2013, 21:12

Eh ok war ich doch auf dem richtigen Weg.
Als Parameter/Rückgabewert sind RawPointer aber still the best oder wie ist das am besten mit unique_ptr umsetzbar?

MfG
Check



C-/C++-Quelltext

1
2
3
4
5
6
7
8
std::unique_ptr<AClass> doSomething()
{
  std::unique_ptr<AClass> ptr(new AClass(...));
  ...
  /* do something nice with ptr */
  ...
  return std::move(ptr);
}

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

21.06.2013, 21:18

korrekt

Ich denk die meiste Verwirrung um Smartpointer entsteht dadurch, dass bereits der Name suggeriert, dass Smartpointer irgendwie eine Alternative zu rohen Pointern darstellen. Das ist jedoch völlig falsch. Wie BlueCobold bereits schön illustriert hat, repräsentieren Smartpointer lediglich den Besitz von Ressourcen. Um Referenzen auf Ressourcen herumzureichen, sodass andere damit arbeiten können, ohne dass die Ressource aber in ihren Besitz übergeht, verwendet man ganz normale Pointer bzw. Referenzen...

Werbeanzeige