Smartpointer gesucht
-
Hallo,
ich suche eine bestimmte Art von Smartpointer und würde gerne wissen, ob es so einen schon im Standard gibt (oder mit mit C++0x geben wird).
Gesucht ist fast das gleiche wie auto_ptr. Allerdings soll der Speicher nicht freigegeben werden, sobald irgendein auto_ptr darauf gelöscht wird, sondern erst, wenn der allererste auto_ptr darauf gelöscht wird.wurst_ptr<int> p1; {wurst_ptr<int> p2(new int); {wurst_ptr<int> p3 = p2;} cout << *p2; // Fehler mit auto_ptr, kein Fehler mit dem gesuchten p1 = p2;} cout << *p1; // Fehler. Speicher wurde freigegeben, als p2 gelöscht wurde
Ich hoffe, ich habe es verständlich erklärt, und noch mehr hoffe ich, dass es sowas auch gibt
-
Reicht denn shared_ptr nicht für deine Zwecke? (gibt es in Boost, TR1 und ab C++0x auch im Standard)
-
Es wäre möglich, dass mit einem shared_ptr zu machen, aber ich habe immer ein mieses Gefühl, wenn ich einen solchen da nutze, wo der gesuchte Smartpointer auch möglich wäre.
Ich finde den Code dann nicht so schön, weil er noch "verfeinert" werden könnte.
-
Wie sieht denn dein Anwendungsfall aus? Ich kann mir gerade nicht vorstellen, wo so ein Smartpointer nützlich wäre.
-
Wurstinator schrieb:
Allerdings soll der Speicher nicht freigegeben werden, sobald irgendein auto_ptr darauf gelöscht wird, sondern erst, wenn der allererste auto_ptr darauf gelöscht wird.
Was sollen eigentlich die übrigen Pointer machen, wenn dieser "allererste auto_ptr" zerstört wird, aber noch ein weiterer überlebt hat?
Eventuell wäre da eine Kombination aus shared_ptr (für den Original-Zeiger, der sich auch um die Freigabe kümmern soll) und weak_ptr (für die Hilfszeiger, die nur kurzzeitig überleben) geeignet.
-
Wurstinator schrieb:
Allerdings soll der Speicher nicht freigegeben werden, sobald irgendein auto_ptr darauf gelöscht wird, sondern erst, wenn der allererste auto_ptr darauf gelöscht wird.
Warum muss es dann überhaupt ein (Smart-)Pointer sein? Eine nackte Instanz macht genau das, was du willst (ausser wenn du ein C-Array hast, dann heisst die Lösung std::tr1::array<>).
-
@ 314159265358979: Ein Member einer Klasse ist dieser Smartpointer und diesen möchte ich in einer nicht-Member-Funktion kurz zwischenspeichern.
@ CStoll: Die übrigen haben dann Pech gehabt und zeigen auf nichts mehr
weak_ptr habe ich mir gerade mal angesehen, aber wenn ich das recht verstehe, kann ich damit gar nicht direkt auf die Daten zugreifen, sondern muss erstmal einen shared_ptr erstellen. Das wäre dann ja kein Gewinn.@ nacktwurst: Ja, aber du weißt doch, dass Raw Pointers in C++ böse sind
-
Wurstinator schrieb:
Es wäre möglich, dass mit einem shared_ptr zu machen, aber ich habe immer ein mieses Gefühl, wenn ich einen solchen da nutze, wo der gesuchte Smartpointer auch möglich wäre.
Ich finde den Code dann nicht so schön, weil er noch "verfeinert" werden könnte.Der "gesuchte" Smart-Pointer hat eine Spezialfall-Semantik, die du so kaum irgendwo fertig findest. Aber wenn du gerade so gut
shared_ptr
nehmen kannst, nimm ihn doch.Wurstinator schrieb:
weak_ptr habe ich mir gerade mal angesehen, aber wenn ich das recht verstehe, kann ich damit gar nicht direkt auf die Daten zugreifen, sondern muss erstmal einen shared_ptr erstellen.
Ja, musst du, da du während des Zugriffs eine starke Referenz brauchst, damit das Objekt nicht freigegeben wird.
weak_ptr
ist eine schwache Referenz und behält Objekte nicht am Leben.
-
Nexus schrieb:
Wurstinator schrieb:
Es wäre möglich, dass mit einem shared_ptr zu machen, aber ich habe immer ein mieses Gefühl, wenn ich einen solchen da nutze, wo der gesuchte Smartpointer auch möglich wäre.
Ich finde den Code dann nicht so schön, weil er noch "verfeinert" werden könnte.Der "gesuchte" Smart-Pointer hat eine Spezialfall-Semantik, die du so kaum irgendwo fertig findest. Aber wenn du gerade so gut
shared_ptr
nehmen kannst, nimm ihn doch.Werde ich auch tun
Aber wie gesagt, ich finde das nicht so schön und fragen, ob es so einen Typ nicht schon gibt, kostet ja nichts.
-
Nimm rohe Zeiger zum "kurz zwischenspeichern", wenn garantiert ist, dass es wirklich immer "kurz genug" ist.
Als Member in der Klasse nimmst du dann nen unique_ptr.
Ferdich.
-
Wurstinator schrieb:
Aber wie gesagt, ich finde das nicht so schön und fragen, ob es so einen Typ nicht schon gibt, kostet ja nichts.
Warum sollte es so etwas schon geben, wenn es praktisch keine Funktion erfüllt. Ich sehe den Sinn nämlich immer noch nicht.
Ich würde sogar behaupten, dass Du so etwas auch nicht brauchst...
-
ich glaube du hast nackwurst falsch verstanden. Ich meine auch, dass das wahrscheinlich das richtige für dich ist.
Nicht so
void g(super_ptr<Foo>); void f() { super_ptr<Foo> master(new Foo); g(master); }
sondern so
void g(Foo&); void f() { Foo master; g(master); }
Der automatische Speicher, der Stack bietet dir doch genau was du suchst.
-
@ hustbaer: Hm, so könnte ich es auch machen. Mal sehen.
@ krümelkacker: Was heißt denn "brauchen". Ich brauche auch keine shared_ptr oder sonstwas. Das dient ja nur dazu, mir das Programmieren angenehmer zu machen.
@ brotbernd: Ach, so war das gemeint. Allerdings besteht dann ja das Problem, dass die Daten kopiert werden, wenn ich ein f-Objekt kopiere.
-
Wurstinator schrieb:
Allerdings besteht dann ja das Problem, dass die Daten kopiert werden, wenn ich ein f-Objekt kopiere.
Damit ich dich nicht nochmals falsch verstehe: Was willst du kopieren?
f
ist eine Funktion. Falls duFoo
meinst: Ja, natürlich führt eine Kopie vonFoo
dazu, dassFoo
kopiert wirdNimm eben Referenzen oder Zeiger, wenn du lediglich Verweise brauchst.
-
Nexus schrieb:
Wurstinator schrieb:
Allerdings besteht dann ja das Problem, dass die Daten kopiert werden, wenn ich ein f-Objekt kopiere.
Damit ich dich nicht nochmals falsch verstehe: Was willst du kopieren?
f
ist eine Funktion. Falls duFoo
meinst: Ja, natürlich führt eine Kopie vonFoo
dazu, dassFoo
kopiert wirdNimm eben Referenzen oder Zeiger, wenn du lediglich Verweise brauchst.
Tut mir Leid, dein Code und meine Gedanken sind ineinander geraten
Ich meinte, falls eine Klasse einen Foo-Member und keinen shared_ptr<Foo>-Member hat, wird dieser kopiert.Ich werds glaube ich mit unique_ptr und raw pointers machen, aber auch ein Danke für die anderen Vorschläge
-
edit: gelöscht (gute Einstellung, aber schlechte Wortwahl).