Löschen eines Objekts das als Referenz übergeben wurde (Newbee-Question ;-)
-
Hallo!
Es wär spitzenklasse wenn mir jemand kurz helfen könnte – finde bei meinem Anfänger-Problem selbst keine Lösung L
Problem:
Ich möchte ein Objekt in main () mit delete löschen, das
- ich in einer anderen Funktion
- mit new erzeugt habe
- und am Ende der Funktion mit return als Referenz übergeben habe.
Wie müsste ich delete benutzen um dieses Objekt zu löschen?Konkret:
Im nachstehenden Code möchte ich die Referenz &bestpractice löschen, die auf das Objekt winner in der Funktion auswahl referenziert löschen am Ende der Funktion main. Der einzige Code den ich hinkriege & den mein Compiler auch akzeptiert ist: delete & bestpractice;
Wenn ich aber den Funktionsaufruf und das delete Kommando in eine Endlos-Schleife packe, sehe ich wie kontinuierlich mein Arbeitsspeicher gefüllt wird ohne Ende. Sobald ich in der Funktion auswahl() „Individual * winner = new Individual;“ auskommentiere (und den Rest der Funktion entsprechend anpasse), habe ich das Problem nicht mehr - daher denk ich mal mit meinem Anfänger wissen, dass mein Objekt nicht gelöscht wird JCode dazu:
class Individual
{
…<some code>…
};Individual & auswahl (Individual *b, const int anzahl)
{
Individual temp;
temp = *b;
…<some code>…
Individual * winner = new Individual;
* winner = temp;
return * winner;
}int main ()
{
int numberindiv = 15;
Individual *creature = new Individual [numberindiv];
…<some code>…
Individual & bestpractice = auswahl (creature, numberindiv );
…<some code>…
delete & bestpractice;
return 0;
}Vielen Dank an Euch für Eure Antwort!
hogg
-
mach's mit pointern statt referenzen. deine 'auswahl'-funktion return'ed dann den pointer und du kannst ihn problemlos deleten.
beispiel:object *f() { return new object; } ... object *o = f(); ... delete (o); ...
-
delete &bestpractice ist schon richtig. Das Leck müsste folglich auch auftreten, wenn du die Funktion einen Zeiger zurückgeben läßt und den Rest entsprechend anpasst. Ist der Destruktor von Individual vielleicht verkehrt? BTW ich hoffe, creature wird auch irgendwann deletet.
-
Bashar schrieb:
delete &bestpractice ist schon richtig. Das Leck müsste folglich auch auftreten, wenn du die Funktion einen Zeiger zurückgeben läßt und den Rest entsprechend anpasst. Ist der Destruktor von Individual vielleicht verkehrt? BTW ich hoffe, creature wird auch irgendwann deletet.
Aber die Refernez wird doch dadurch ungueltig. Auch wenn das in einem Block
gemacht wird und die Referenz am Ende des Blocks nicht mehr existiert, aendert
das doch nichts daran, dass die Referenz ungueltig wird.mfg
v R
-
Bashar schrieb:
delete &bestpractice ist schon richtig. Das Leck müsste folglich auch auftreten, wenn du die Funktion einen Zeiger zurückgeben läßt und den Rest entsprechend anpasst. Ist der Destruktor von Individual vielleicht verkehrt? BTW ich hoffe, creature wird auch irgendwann deletet.
Vielen Dank für die schnelle Hilfe
Eine Frage zum Destruktor, da hätte ich den Default gelassen, da ich es dann manuell am Ende von main() lösche, ist das nicht ok?
Ich würds gern mit Referenzen machen, damit ich das lerne
Danke für Eure Hilfe!
Jochen
-
hogg schrieb:
Bashar schrieb:
delete &bestpractice ist schon richtig. Das Leck müsste folglich auch auftreten, wenn du die Funktion einen Zeiger zurückgeben läßt und den Rest entsprechend anpasst. Ist der Destruktor von Individual vielleicht verkehrt? BTW ich hoffe, creature wird auch irgendwann deletet.
Vielen Dank für die schnelle Hilfe
Eine Frage zum Destruktor, da hätte ich den Default gelassen, da ich es dann manuell am Ende von main() lösche, ist das nicht ok?
Ich würds gern mit Referenzen machen, damit ich das lerne
Danke für Eure Hilfe!
Jochen
Deine mit new erzeugten Objekte werden nicht automatisch geloescht, wenn das
Objekt geloescht wird und du nur einen default-DTor hast.Das am Ende des Programms der gesamte Speicher freigegeben wird, darauf wuerde
ich mich nicht verlassen. Im Allgemeinen wird das wohl vom Betriebssystem so
gemacht, muss es aber nicht. Es ist immer gut, wenn man den Speicher den man
reserviert hat, auch wieder freigibt (man raeumt ja auch sein Zimmer auf, wenn
es unordentlich ist und laesst es nicht seine Mutter machen).mfg
v R
-
virtuell Realisticer schrieb:
Aber die Refernez wird doch dadurch ungueltig.
Na und? Ist doch nicht verboten.
-
Bashar schrieb:
virtuell Realisticer schrieb:
Aber die Refernez wird doch dadurch ungueltig.
Na und? Ist doch nicht verboten.
Ich dachte Referenzen muessten immer gueltig sein. Neuzuweisung ja ist nicht
moeglich.Aber wenn dem nicht so ist
[edit]
Ich glaub ich hab hier grad was verwechselt: Referenzen muessen initialisiert
werden, duerfen hier also nicht ungueltig sein.
[/edit]mfg
v R
-
Vielen Dank für Eure Antworten - hab wieder viel gelernt.
Konkret auf meine Frage bezogen, wärs klasse wenn Ìhr mir nochmal helfen könntet.
Ich hätte jetzt verstanden: der Code ist eigentlich formal so richtig, das Objekt auf das die Refenrenz zeigt, sollte eigentlich gelöscht werden durch: delete & bestpractice; Oder versteh ich das falsch?
Was würdet Ihr mir dann als nächsten Schritt empfehlen, wenn es aber trotzdem nicht läuft und ich es mit einer Refernz lösen möchte?
Sorry, für meine hartnäckigkeit, aber ich würde das sehr gerne lernen
Danke Euch vielmals!
hogg
-
Zeig mal Konstruktor und Destruktor von der Individual-Klasse.
-
Bashar schrieb:
Zeig mal Konstruktor und Destruktor von der Individual-Klasse.
Danke Dir Bashar!
Der Konstruktor ist der Folgende:
Individual::Individual(int zid, int zgeneration)
{
id = zid;
generation = zgeneration;
varianz = 10;
props_max=255;
for (int i = 0; i < 300; i++)
{
props[i]=(rand()%(props_max+1));
}
}Als Destruktor verwende ich nur den default-Destruktor.
Danke Dir nochmal
hogg
-
Der leakt offensichtlich nicht. Komisch.