Verhindern, dass Objekt auf stack angelegt wird?
-
MagicalFlyingMoron schrieb:
Hallo.
Wie kann ich verhindern, dass ein Objekt auf dem stack erzeugt wird?Wenn ich dies aus irgendeinen Grund brauche, sieht es bei mir meist in etwa wie folgt aus:
#include <memory> // TR1 Header, bzw. <boost/shared_ptr.hpp> oder vergleichbares class MyClass { public: static std::tr1::shared_ptr<MyClass> Create() { return std::tr1::shared_ptr<MyClass>(new MyClass); }; private: MyClass(); MyClass(MyClass const &); // Dieser muß auch unterbunden werden... // und über den Zuweisungsoperator solltest du dir auch Gedanken machen };
-
An sowas hatt ich auch schon gedacht.
Wollt es eigendlich mit dem new operator machen.
Wenns aber nicht funktioniert ist es auch nicht so schlimm.
Danke.
-
Don06 schrieb:
Am besten auch eine Freigabefunktion, dann kannst du dir aussuchen, wie du den Speicher allokierst.
Ich würde sowas von Smartpointern etc. übernehmen lassen. Alles was man separat aufrufen muß, verleitet dazu vergessen zu werden.
-
MagicalFlyingMoron schrieb:
An sowas hatt ich auch schon gedacht.
Wollt es eigendlich mit dem new operator machen.
Wenns aber nicht funktioniert ist es auch nicht so schlimm.Das Problem ist, dass Objekte, die mit
newerstellt werden, eigentlich gerade so gut auf dem Stack als automatische Variablen deklariert werden können.Aus reiner Neugier: Wofür brauchst du das?
-
@asc:
Das mit dem shared_ptr sieht interessant aus. guck ich mir gleich mal an. Könnt genau das sein was ich brauche.
-
Nexus schrieb:
Aus reiner Neugier: Wofür brauchst du das?
Ich wollte in einer Funktion
delete this;benutzen. Deswegen darf auf gar keinen Fall ein Objekt auf dem Stack abgelegt werden.
-
Okay. Dass du bei Anweisungen wie
delete this;aber vorsichtig sein musst, weisst du, oder?
Möglicherweise gibt es auch eine bessere Lösung für das, was du tun willst. Es ist wahrscheinlich auch verwirrend für den Anwender, wenn er das Objekt mit
newerstellt, dieses sich aber selber perdeletelöscht (nur so nebenbei)...
-
MagicalFlyingMoron schrieb:
Nexus schrieb:
Aus reiner Neugier: Wofür brauchst du das?
Ich wollte in einer Funktion
delete this;benutzen. Deswegen darf auf gar keinen Fall ein Objekt auf dem Stack abgelegt werden.
Dann ist auch der shared_ptr nichts für dich.
Die überlegungen zu "delete this" kenne ich eigentlich nur bei dem anlegen nicht-modaler Fenster...
cu André
-
Ist mir schon klar, dass ich mit delete this vorsichtig sein muss.
Ich hab mir das Programm so vorgestellt:class bar; class inerface_foo{ friend class bar; protected: virtual void message(string& nonsense)=0; virtual ~interface_foo(); };Wobei irgendeine Funktion von bar in einer großen Schleife message aufruft.
Der "Anwender" soll von interface_foo erben und darf dann mitif (verarbeite(nonsense)==error) { delete this; return; }sein Objekt zerstören.
-
Möchtest du die Aufgabe,
interface_foo-Instanzen zu zerstören, nicht der Klassebarübertragen?Dann könntest du in
interface_fooeinebool-Variable als Flag deklarieren, die anzeigt, ob der Zustand gültig ist oder nicht. Oder du gibst direkt der Funktionmessage()den Rückgabetypenbool. So kann der Aufrufer sehen, ob das Objekt noch weiterexistieren soll. Verstehst du, was ich meine?