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
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 |
struct SBook {...}; class Controller {...}; class View {...}; class Data { private: map<unsigned int, SBook> m_Books; shared_ptr<SBook> Data::GetBook(unsigned int id) { ... return make_shared<SBook>(foundBookIt->second); } }; |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 |
void Controller::DoSomething() { shared_ptr<SBook> pBook = m_pData->GetBook(anyID); m_pView->DoSomething(pBook); } void View::DoSomething(shared_ptr<SBook> pBook) { // as per-val shared ptr pBook->Burn(); } |
C-/C++-Quelltext |
|
1 2 3 |
void View::DoSomething(const shared_ptr<SBook>& pBook) { // as const ref shared ptr! pBook->Burn(); } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 |
void Controller::DoSomething() { shared_ptr<SBook> pBook = m_pData->GetBook(anyID); m_pView->DoSomething(pBook); // implicit cast to weak_ptr? } void View::DoSomething(weak_ptr<SBook> pBook) { // as weak ptr per val auto pOwnedBook = pBook.lock(); pOwnedBook->Burn(); } |
Community-Fossil
C-/C++-Quelltext |
|
1 |
map<unsigned int, std::unique_ptr<SBook> > m_Books; |
C-/C++-Quelltext |
|
1 2 |
const SBook& Data::GetBook(unsigned int id) const SBook& Data::GetBook(unsigned int id) |
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
Alter Hase
Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy
Wie meine beiden Vorgänger schon sagten ist ein Smart-Pointer an der Stelle eher die falsche Wahl.
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
Was Owner heißt weiß ich schon Die Frage war nur, von WAS der Owner - deiner Antwort entehme ich, der Owner von der InstanzZitat
Ownership ist, wie jeder Übersetzer dir sagen sollte, einfach der Besitz. Das Buch ist im Besitz von einem anderen Objekt oder beim "std::shared_ptr" in der Regel mehreren.
Naja es geht mir ja gerade darum, zu vermeiden, dass ein Book schon aus der Map entfernt wird, solange es noch außerhalb benutzt wird und möglicherweise invalid wirdZitat
Wenn alle Besitzer(Owners) zerstört sind wird der Besitz(Ownership) also das Buch zerstört.
C-/C++-Quelltext |
|
1 2 |
map<unsigned int, shared_ptr<SBook>> books; shared_ptr<SBook> GetBook(unsigned int); |
C-/C++-Quelltext |
|
1 2 3 4 5 |
void Data::Delete(unsigned int id) { ... assert(foundBookIt->second.unique()); m_Books.erase(id); } |
Hast du da ein "nicht" vergessen?Zitat
So lange du den Besitz, und dementsprechend die Verantwortung zum Löschen, an ein anderes Objekt übergeben möchtest, solltest du nur (wie meine Vorredner schon sagten) einen raw pointer zurück geben.
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
Nein, hat er nicht. Ein Shared-Ptr wäre Übertragung der Ownership. Und genau das wäre falsch. Ein Raw-Pointer wäre korrekt. Um Gültigkeit musst Du Dir dabei anderweitig Gedanken machen. Natürlich macht es keinen Sinn, dass ein Buch außerhalb noch verwendet wird, obwohl die eigentliche Instanz schon vom Owner gelöscht wurde. Aber wenn ich Dir meinen Wohnungsschlüssel wegnehme, darfst Du auch nicht mehr in meine Wohnung Oft ist das aber kein Problem, weil Instanzen hierarchisch verschachtelt sind und eine untere Schicht nur Raw-Pointer aus einer höheren Schicht bekommt. Daher ist das untere Objekt im Normalfall schon weg, bevor das Pointer-Objekt gelöscht wird.Hast du da ein "nicht" vergessen?
Zitat von »iSmokiieZz«
dass ein Book schon aus der Map entfernt wird, solange es noch außerhalb benutzt wird
Zitat von »iSmokiieZz«
... dann könnte man in der Delete Funktion von Data ja auch mit unique() ein vorzeitiges löschen verhindern und ggf eine Assertion ausgeben, um leaks aufzudecken:
Zitat von »iSmokiieZz«
Ansonsten möchte ich ja vermeiden, dass der Pointer, den GetBook() zurückgibt, nicht dazu benutzt wird, das Objekt zu löschen
Werbeanzeige