C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Löschen von Objekten
Goto page 1, 2  Next
 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Florian Wolferseder
Guest





PostPosted: Thu Jan 04, 2007 3:19 am    Post subject: Löschen von Objekten Reply with quote



Hallo,

eine Frage kann ich ein Objekt einer Klasse löschen?

z.B:
class Auto
{
......
};
int main()
{
Auto Bmw;
"Löschen" Bmw;
...
}

Danke Florian
Back to top
Bernhard Berger
Guest





PostPosted: Thu Jan 04, 2007 7:59 pm    Post subject: Re: Löschen von Objekten Reply with quote



Moin,

Quote:
eine Frage kann ich ein Objekt einer Klasse löschen?

z.B:
class Auto
{
.....
};
int main()
{
Auto Bmw;
"Löschen" Bmw;
..
}

ja und nein. In deinem Beispiel wird die Instanz der Klasse Auto auf dem
Stack angelegt. Das bedeutet, dass diese Instanz so lange bestehen bleibt,
wie das Programm sich in dem aktuellen Block (hier die Funktion) befindet..
Da es sich hier um die main-Funktion handelt wird die Instanz bis zum
Ende des Programmlaufs existieren. Der Vorteil von Stackvariablen ist,
dass Du dich nicht um das aufräumen/freigeben kümmern musst.

Wenn Du die Instanz länger behalten möchtest (oder aus welchem Grund
auch immer), musst Du sie auf dem Heap anlegen. Dafür gibt es das
Schlüsselwort new, welches dir dort Speicher reserviert, das Objekt
anlegt und den Konstruktor aufruft. Zum Freigeben muss dann ein delete
aufgerufen werden. Hier muss man allerdings aufpassen, da immer noch
Zeiger auf die Instanz zeigen können, etc..

Beispiel:

class Auto { ... };

void main( ) {
Auto *BMW = new Auto;

Auto->Tanken( );
Auto->Fahren( );

delete BMW;
}


Bernhard
Back to top
Bob Hairgrove
Guest





PostPosted: Thu Jan 04, 2007 8:02 pm    Post subject: Re: Löschen von Objekte n Reply with quote



On Wed, 3 Jan 2007 22:19:01 +0100, "Florian Wolferseder"

<news (AT) wolferseder (DOT) de> wrote:



Quote:
Hallo,



eine Frage kann ich ein Objekt einer Klasse löschen?



z.B:

class Auto

{

.....

};

int main()

{

Auto Bmw;

"Löschen" Bmw;

..

}



Danke Florian



Es gibt einige Möglichkeiten:



=======
So:

=======


int main()

{

{

Auto Bmw;

} // <-- hier wird Bmw automatisch zerstört,

// weil der Gültigkeitsbereich ("scope")

// durch die geschweifte Klammer beendet wurde

//...

// Weiterer Code könnte hier ausgeführt werden...

// allerdings steht Bmw natürlich nicht mehr

// zur Verfügung.

}



=======
Oder so:

=======


int main()

{

Auto *pBmw = new Auto;

delete pBmw;

}



=======
Noch besser ist es so:

=======


#include <memory>

int main()

{

std::auto_ptr<Auto> spBmw(new Auto);

// spBmw wie einen normalen Zeiger verwenden

// ...

// Am Ende des Gültigkeitsbereichs wird

// spBmw automatisch gelöscht; delete ist

// nicht nötig.

}



Die Verwendung von std::auto_ptr oder eines ähnlichen Konstrukts, wie

z.B. die vielseitigen "smart pointers" in der Boost-Bibliothek, ist in

Hinsicht auf Exception-Safety sehr empfehlenswert.



--

Bob Hairgrove

NoSpamPlease (AT) Home (DOT) com
Back to top
Rolf Magnus
Guest





PostPosted: Thu Jan 04, 2007 8:11 pm    Post subject: Re: Löschen von Objekten Reply with quote

Florian Wolferseder wrote:

Quote:
Hallo,

eine Frage kann ich ein Objekt einer Klasse löschen?

z.B:
class Auto
{
.....
};
int main()
{
Auto Bmw;
"Löschen" Bmw;
..
}

Das brauchst du nicht. Es wird automatisch gelöscht, wenn die Funktion
beendet wird.
Back to top
Markus Wichmann
Guest





PostPosted: Thu Jan 04, 2007 8:14 pm    Post subject: Re: Löschen von Objekten Reply with quote

Florian Wolferseder schrieb:
Quote:
Hallo,

eine Frage kann ich ein Objekt einer Klasse löschen?

z.B:
class Auto
{
.....
};
int main()
{
Auto Bmw;
"Löschen" Bmw;
..
}

Danke Florian

Indem du sein Scope beendest. Also so hier:

int main()
{
Auto BMW(); // Wenn du den ctor aufrufen willst.
}

Ist zwar nicht schön, weil main() nichts zurückgibt, aber macht in etwa,
was du willst. Du kannst auch das ganze so hier ändern:

int main()
{
{
Auto BMW();
mach_was_mit(BMW);
schon_fertig();
}
Den_Rest_zu_Fuß();
return 0;
}

Jetzt gibt main() etwas zurück und das Auto wird vorzeitig destruiert.
Verstanden, wie es läuft?
HTH,
Markus
--
Was haben eigentlich alle gegen Beamte? Die tun doch nichts.
Homepage: http://wichi.wi.funpic.de (momentan noch etwas trocken)
Root-Zertifikat: http://wichi.wi.funpic.de/certs/ca/ca.crt
Mail-Zertifikat: http://wichi.wi.funpic.de/certs/gmx/cert.pem
Back to top
Torsten Robitzki
Guest





PostPosted: Thu Jan 04, 2007 8:45 pm    Post subject: Re: Löschen von Objekten Reply with quote

Florian Wolferseder wrote:

Quote:
Hallo,

eine Frage kann ich ein Objekt einer Klasse löschen?

Ja,
Quote:

z.B:
class Auto
{
.....
};
int main()
{
{
Auto Bmw;
"Löschen" Bmw;
..
} <- ab hier gibt es Dein Auto nicht mehr.
}

Danke Florian

Bitte.
Back to top
Andreas Huennebeck
Guest





PostPosted: Thu Jan 04, 2007 9:50 pm    Post subject: Re: Löschen von Objekten Reply with quote

Florian Wolferseder wrote:

Quote:
eine Frage kann ich ein Objekt einer Klasse löschen?

Kommt darauf an, wie es erzeugt wurde.

Quote:
z.B:
class Auto
{
.....
};
int main()
{
Auto Bmw;
"Löschen" Bmw;

Das ist hier nicht notwendig, da der Bmw auf dem Stack
erzeugt wurde und damit ...

Quote:
..
}

.... genau hier (beim Erreichen der geschwungenen Klammer)
automatisch gelöscht wird.

Wenn man ihn aber mit new anlegt, muss man ihn mit delete
oder delete[] entfernen:

Auto* ein_bmw = new Auto; // erzeuge ein Auto auf dem freien Speicher (Heap)
delete ein_bmw;

Auto* viele_vws = new Auto[200]; // erzeuge 200 Autos auf dem Heap
delete[] viele_vws;

Tschau
Andreas
--
Andreas Hünnebeck | email: acmh (AT) gmx (DOT) de
----- privat ---- | www : http://www.huennebeck-online.de
Fax/Anrufbeantworter: 0721/151-284301
GPG-Key: http://www.huennebeck-online.de/public_keys/andreas.asc
PGP-Key: http://www.huennebeck-online.de/public_keys/pgp_andreas.asc
Back to top
Rolf Magnus
Guest





PostPosted: Thu Jan 04, 2007 11:40 pm    Post subject: Re: Löschen von Objekten Reply with quote

Markus Wichmann wrote:

Quote:
int main()
{
Auto BMW(); // Wenn du den ctor aufrufen willst.

Da ist kein Konstruktor involviert. Es handelt sich nämlich um die
Deklaration einer Funktion namens BMW, die ein Auto zurückgibt und keine
Parameter annimmt.

Quote:
}

Ist zwar nicht schön, weil main() nichts zurückgibt, aber macht in etwa,
was du willst.

main() gibt implizit 0 zurück.
Back to top
Thomas Maeder
Guest





PostPosted: Fri Jan 05, 2007 12:20 am    Post subject: Re: Löschen von Objekten Reply with quote

Markus Wichmann <nullplan (AT) gmx (DOT) net> writes:

Quote:
int main()
{
Auto BMW(); // Wenn du den ctor aufrufen willst.

Das ist die Deklaration einer Funktion BMW mit Rückgabetype Auto. Du
meinst wohl:

Auto BMW;
Back to top
Markus Wichmann
Guest





PostPosted: Fri Jan 05, 2007 3:49 pm    Post subject: Re: Löschen von Objekten Reply with quote

Thomas Maeder schrieb:
Quote:
Markus Wichmann <nullplan (AT) gmx (DOT) net> writes:

int main()
{
Auto BMW(); // Wenn du den ctor aufrufen willst.

Das ist die Deklaration einer Funktion BMW mit Rückgabetype Auto. Du
meinst wohl:

Auto BMW;

Nein, ich meine

Auto BMW();

gleichbedeutend mit

Auto BMW = Auto();

Was den Konstruktor aufruft. In diesem Fall wurde keiner definiert,
weswegen der Compiler einen hinzufügt, der nichts macht. Es ist also
eigentlich sinnfrei, aber des guten Tones willen...
HTH,
Markus
--
Was haben eigentlich alle gegen Beamte? Die tun doch nichts.
Homepage: http://wichi.wi.funpic.de (momentan noch etwas trocken)
Root-Zertifikat: http://wichi.wi.funpic.de/certs/ca/ca.crt
Mail-Zertifikat: http://wichi.wi.funpic.de/certs/gmx/cert.pem
Back to top
Jürgen Herz
Guest





PostPosted: Fri Jan 05, 2007 4:36 pm    Post subject: Re: Löschen von Objekten Reply with quote

Andreas Huennebeck wrote:
Quote:
class Auto
{
.....
};
int main()
{
Auto Bmw;
"Löschen" Bmw;

Das ist hier nicht notwendig, da der Bmw auf dem Stack
erzeugt wurde und damit ...

..
}

... genau hier (beim Erreichen der geschwungenen Klammer)
automatisch gelöscht wird.

Da es hier um die Lebenszeit eines Objekts geht, hänge ich mich mal rein.
Bei diesem Code
int& func()
{
int z = 17;
return z;
}

und
int mz = func();
bzw.
int& mz = func();

meckert gcc in beiden Fällen zwar "warning: reference to local variable `z'
returned".
In ersterem Fall enthält aber mz immerhin 17, in letzterem Blödsinn.
In Perl wird ein out-of-scope-Objekt erst gelöscht wenn es keine Referenz
mehr darauf gibt. In C++ dürfte es anders sein (ja/nein?), also auch
verständlich wenn die Sache schiefgeht.
Ist es dann nur Zufall bzw. compilerabhängig wenn mz im ersten Fall den
korrekten Wert enthält?

Jürgen
Back to top
Bob Hairgrove
Guest





PostPosted: Fri Jan 05, 2007 4:46 pm    Post subject: Re: Löschen von Objekte n Reply with quote

On Fri, 05 Jan 2007 10:49:04 +0100, Markus Wichmann <nullplan (AT) gmx (DOT) net>

wrote:



Quote:
Nein, ich meine



Auto BMW();



gleichbedeutend mit



Auto BMW = Auto();



Es ist aber nicht das Gleiche!

(s. C++-Standard, Paragraph 8.5 Absatz 8)



--

Bob Hairgrove

NoSpamPlease (AT) Home (DOT) com
Back to top
Rolf Magnus
Guest





PostPosted: Fri Jan 05, 2007 6:40 pm    Post subject: Re: Löschen von Objekten Reply with quote

Markus Wichmann wrote:

Quote:
Thomas Maeder schrieb:
Markus Wichmann <nullplan (AT) gmx (DOT) net> writes:

int main()
{
Auto BMW(); // Wenn du den ctor aufrufen willst.

Das ist die Deklaration einer Funktion BMW mit Rückgabetype Auto. Du
meinst wohl:

Auto BMW;

Nein,

Solltest du aber.

Quote:
ich meine

Auto BMW();

gleichbedeutend mit

Auto BMW = Auto();

Das ist absolut nicht gleichbedeutend. Nochmal: Das erste ist eine
Funktionsdeklaration (ähnlich wie z.B. int myfunc(); es wäre), das zweite
eine Variablendefinition.

Quote:
Was den Konstruktor aufruft.

Beim Erzeugen einer Klasseninstanz wird immer der Konstruktor aufgerufen.
Das kann man gar nicht verhindern.
Back to top
Rolf Magnus
Guest





PostPosted: Fri Jan 05, 2007 6:44 pm    Post subject: Re: Löschen von Objekten Reply with quote

Jürgen Herz wrote:

Quote:
Da es hier um die Lebenszeit eines Objekts geht, hänge ich mich mal rein.
Bei diesem Code
int& func()
{
int z = 17;
return z;
}

und
int mz = func();
bzw.
int& mz = func();

meckert gcc in beiden Fällen zwar "warning: reference to local variable
`z' returned".
In ersterem Fall enthält aber mz immerhin 17, in letzterem Blödsinn.
In Perl wird ein out-of-scope-Objekt erst gelöscht wenn es keine Referenz
mehr darauf gibt. In C++ dürfte es anders sein (ja/nein?), also auch
verständlich wenn die Sache schiefgeht.

Das stimmt. In C++ wird eine lokale Variable gelöscht, sobald sie den Scope
verlässt, unabhängig davon, ob noch Referenzen oder Zeiger darauf
existieren.

Quote:
Ist es dann nur Zufall bzw. compilerabhängig wenn mz im ersten Fall den
korrekten Wert enthält?

Formal ist das Verhalten undefiniert, was in etwa der Definition "Zufall
bzw. compilerabhängig" entspricht.
Back to top
Olaf Krzikalla
Guest





PostPosted: Fri Jan 05, 2007 6:59 pm    Post subject: Re: Löschen von Objekten Reply with quote

Hi,

Markus Wichmann wrote:
Quote:
Thomas Maeder schrieb:

Markus Wichmann <nullplan (AT) gmx (DOT) net> writes:


int main()
{
Auto BMW(); // Wenn du den ctor aufrufen willst.

Das ist die Deklaration einer Funktion BMW mit Rückgabetype Auto. Du
meinst wohl:

Auto BMW;


Nein, ich meine

Auto BMW();
Nein, das meinst Du nicht. Du schreibst es nur. Das, was Du schreibst,

und das, was Du dem Compiler sagen willst, haben nichts miteinander zu tun.

Quote:
gleichbedeutend mit

Auto BMW = Auto();
Es ist nicht mit


Auto BMW;

und schon gar nicht mit

Auto BMW();

gleichbedeutend.


MfG
Olaf Krzikalla
Back to top
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Goto page 1, 2  Next
Page 1 of 2

 
 


Powered by phpBB © 2001, 2006 phpBB Group