Speicherzustand eines Objekts
-
Hallo,
ich würde gerne für verschiedene Instanzen einer klasse speichern ob diese mit new oder lokal erzeugt worden sind.
Hierfür hätte ich in der Klasse new und delete überladen.
Bei New müßte ich dann in eine Statische Variable einen Wert setzen, welcher dann
vom Konstuktor in die Instanz geschrieben wird.
Ist das okay oder ist new und dann konstuktor aufruf nicht atomar ??class foo { .... public: static void * operator new(std::size_t size) { staticIsAllocated=true; return std::malloc(size); } foo():IsAllocated(staticIsAllocated) { staticIsAllocated=false; mall.... } private: static bool staticIsAllocated; bool IsAllocated }Kann mit der übergabe des Wahrheitswertes was schief gehen ??
Grüße Alex
-
Was hast du vor? Spielerei oder ernsthafte Anwendung?
Ich verweise mal auf diesen Thread:
http://www.c-plusplus.net/forum/206880-20
Insbesondere die Beiträge von Shade of Mine auf der dritten Seite.
-
Es gibt Punkte,
Es gibt Kanten, bestehend aus zwei zeigern (Start-End Punkt).
Jeder Punkt hat einen Zeiger auf all seine Kanten.Wenn ich nun einen Punkt lösche, so möchte ich automatisch auch die Kanten dazu löschen.
Je nach dem ob die Kanten mit new oder nicht erzeugt worden ist, sollte ich die Kanten zerstören.Wobei so oder so um die Klasse noch was drum rum kommt, so das ich vorraussichtlich lediglich die new variante benutzen werde.
Trotzdem würde ich die Frage interessieren ob das hin haut.
Treadsafe ist es nicht denke ich....
-
AlexanderKiebler schrieb:
ich würde gerne für verschiedene Instanzen einer klasse speichern ob diese mit new oder lokal erzeugt worden sind.
Tu das bitte bitte bitte nicht. Du löst damit keine Probleme, aber schaffst dir ein Dutzend neue.
Nexus (von <a href= schrieb:
hier)">Nochmals die wichtigsten Gründe, warum es nicht sinnvoll ist, wenn eine Klasse sich unterschiedlich verhält, wenn ihre Objekte automatisch oder dynamisch angefordert wurden. Ganz unabhängig davon, ob die Unterscheidung überhaupt realisierbar ist.
- Du versuchst mit dem Ansatz, benutzerfreundlich zu sein, und den Speicher automatisch freizugeben, wenn er vom Benutzer dynamisch angefordert wurde. Die Idee ist prinzipiell sehr gut, aber das mit der Benutzerfreundlichkeit geht komplett nach hinten los.
- Der Grund ist, dass du Konzepte aus anderen Sprachen (Garbage Collector) 1:1 nach C++ übertragen willst, wo Speicherverwaltung aber ganz anders abläuft. C++ hat viel strengere und eindeutigere Besitzverhältnisse als Sprachen mit GC (Speicher ist nicht geteilt, sondern hat meist einen klaren Besitzer). Normalerweise wird der Speicher von dem freigegeben, der ihn anfordert. Mit deinem Versuch verstösst du gegen diese Konvention.
- Dadurch rufst du beim Benutzer Verwirrung hervor. Wenn der Benutzer ein einfaches
newverwendet, geht er davon aus, den Speicher ohne Probleme mitdeletefreigeben zu können. Er wird sich wundern, wenn ganz normaler Code einfach abstürzt. - Gleichzeitig nimmst du dem Anwender mit dem GC die Freiheit, sich Speicher irgendwie zu verschaffen. Er kann den Stack benutzen, den Heap (
malloc()aus C), den Freestore (new) oder irgendeinen anderen Allokator. Mit einem automatischendeletein deiner Bibliothek zwingst du ihn zur Verwendung desnew-Operators. - In C++ benutzt man das RAII-Idiom, um manuelle Speicherverwaltung zu vermeiden. Damit muss gar niemand mehr explizit den Speicher freigeben, sondern die Aufgabe wird an eine Klasse (z.B. Smart-Pointer) delegiert. Damit ist der Grund dafür, überhaupt einen automatischen Freigabemechanismus in deiner Bibliothek einzurichten, hinfällig.
-
AlexanderKiebler schrieb:
Wenn ich nun einen Punkt lösche, so möchte ich automatisch auch die Kanten dazu löschen.
Je nach dem ob die Kanten mit new oder nicht erzeugt worden ist, sollte ich die Kanten zerstören.Erzeuge die Kanten immer mit
newund die Frage stellt sich gar nicht erst. Als netten Nebeneffekt bist du dabei das Problem los, dass lokale Objekte automatisch am Ende des Scopes zerstört werden und deine Zeiger ungültig machen.