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

the[V]oid

Alter Hase

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

11

26.06.2010, 13:28

Ich finde, man greift viel zu häufig viel zu schnell zu shared_ptr. Gibt Fälle, wo es wirklich eine gute Lösung ist, selbstverständlich, aber teilweise wirds auch als Allzweckwaffe missbraucht. In deinem Fall würde ich eher die bereits von dir selbst präsentierte Lösung favorisieren, wobei du das delete nicht vergessen darfst:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class foo
{
  int *bar;
  bool own;

public:
  foo() : bar( NULL ), own( false )
  {
  }

  void setRef(int *i) { clear(); bar = i; }
  void set(int i){ clear(); if(!bar) bar = new int; *bar = i; }
  void clear()
  {
    if( own && bar )
    {
      delete bar;
      bar = NULL;
    }
  }
};
<< an dieser Stelle ist eine Signatur verstorben >>

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

12

26.06.2010, 13:37

@the[V]oid
Ich würde vorher einen Smart Pointer verwenden, als diesen Code. Z.b keine öffentliches "clear", Kopierkonstruktor, Zuweisungsoperator. Exceptionsicherheit ist akut kein Problem, aber falls ein anderer Typ, als int verwendet wird muss man mehr aufpassen.

13

26.06.2010, 13:48

Ich finde, man greift viel zu häufig viel zu schnell zu shared_ptr. Gibt Fälle, wo es wirklich eine gute Lösung ist, selbstverständlich, aber teilweise wirds auch als Allzweckwaffe missbraucht.
Da hast du völlig Recht. In den meisten Fällen eignen sich weniger mächtige Smart-Pointer wie scoped_ptr, oder Pointer-Container statt STL-Container mit shared_ptr. Eigentlich ist shared_ptr für den Fall gedacht, wo geteilte Besitzverhältnisse tatsächlich erwünscht sind, und sollte nicht als universellen GarbageCollector benutzt werden.

Allerdings muss ich drakon zustimmen, was deinen Code betrifft.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

14

26.06.2010, 13:54

Ich benutze scoped_ptr noch sehr gerne. Ist meistens genau das, was man braucht. Wenn man shared_ptr verwenden will, dann sollte man auch noch den richtigen Umgang mit weak_ptr üben, ansonten kann es auch zu Problemen kommen.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

15

26.06.2010, 14:21

Um nochmal was zum Thema zu sagen: Im konkreten Fall hier würde ich den lookat Point einfach übergeben oder einen Setter dafür anbieten und keine Pointer verwenden. Die Pointervariante macht hier alles nur unnötig kompliziert ohne einen wirklichen Vorteil zu bieten wenn du mich fragst.

Werbeanzeige