pointer
-
Hallo zusammen
vielleicht ist das jetzt eine bloede Frage, aber ich habe ein Problem was allokierung und deallokierung von Speicher bei Pointern betrifft. Wenn ich eine Methode dieser Art habe:
void MyObject::loadSomething(string szName, Object* obj) { if(obj == NULL) { obj = new Object(); } .................... }Der Speicher wird jetzt in der Methode allokiert. Wie deallokiere ich denn sowas? Oder ist es besser Speicher immer ausserhalb einer Methode zu allokieren damit ich ihn nachher auch wieder sauber freigeben kann?
Gruessle
-
Du solltest als erstes den Parameter per Referenz übergeben (Object***&** obj), dann wird die angelegte Adresse auch nach außen zurückgeliefert. Mit dieser Änderung kann das Hauptprogramm dann auch den passenden delete-Aufruf absetzen, um den Speicher wieder freizugeben.
(oder, wenn du das Objekt "außen" nicht benötigst, definier es lokal in der Funktion und gib es selber vor dem return frei)
-
Hmm, also wenn ich das mit *& versuche dann bekomme ich folgende Fehlermeldungen:
default argument: cannot convert from int to *&Ich uebergebe meiner Methode die Pointer mit Defaultwert NULL. Aber wenn ich & schreibe mag er das nicht mehr. Also Object& = NULL.
-
Hi!
Irgendwie klar ne? Eine Referenz muss immer etwas referenzieren. Und NULL ist ungültig.
Du musst also schon einen richtigen Zeiger übergeben.NULL is sowiso doof, denn:
NULL = new Object(); // ???was soll der Compiler da von halten?
grüße
-
Eine andere Idee wäre es, das angelegte Objekt per return zurückzugeben:
Objct* load(const string& name) { Object* ret=new Object; ... return ret; } ... Object* data=load(...);
-
Hallo,
David_pb schrieb:
Eine Referenz muss immer etwas referenzieren.
muss sie gar nicht. Wir gehen nur davon aus, dass sie etwas referenziert.
MfG
GPC
-
Hi!
int main() { int &r; return 0; }Compilier das mal! Klappts?
Ohne Initialisierung wird das nich klappen...Genausowenig wie Referenzen mit temporären Variablen initialisiert werden können.
grüße
-
So direkt kriegst du das auch nicht hin - aber was hältst du von sowas:
int main() { int* pi; int& ri=*pi; return 0; }(nach meinem Kenntnisstand dürfte das sogar compilieren)
-
Mein Problem war, dass ich wissen wollte, wie ich einen Pointer, der in einer Methode allokiert wird, ausserhalb der Methode loeschen kann :-). Mit *& funktionierts, nur kann ich dann meiner Methode keinen Defaultwert fuer dieses Object mehr uebergeben. Den Defaultwert hatte ich, damit ich flexibel gestalten kann, sprich das Object auch nicht uebergeben muss wenn es der User nicht will. Soweit ich das aus den Beitraegen jetzt herauslesen konnte, kann ich das Problem loesen indem ich das Object zurueckgeben lasse oder eben mit *& und dafuer auf den Defaultwert verzichten muss.
Vielen Dank fuer die Vorschlaege und die Hilfen
-
Sowas solltest du einfach überhaupt nicht tun oder du musst eine "Rückgabefunktion" schreiben, die den Speicher wieder freigibt. Also zu loadSomething gibts dann auch ein freeSomething. Wer speicher allokiert sollte ihn gefälligst auch wieder freigeben.
Bye, TGGC (Fakten)