 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Florian Wolferseder Guest
|
Posted: Thu Jan 04, 2007 3:19 am Post subject: Löschen von Objekten |
|
|
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
|
Posted: Thu Jan 04, 2007 7:59 pm Post subject: Re: Löschen von Objekten |
|
|
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
|
Posted: Thu Jan 04, 2007 8:02 pm Post subject: Re: Löschen von Objekte n |
|
|
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
|
Posted: Thu Jan 04, 2007 8:11 pm Post subject: Re: Löschen von Objekten |
|
|
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
|
Posted: Thu Jan 04, 2007 8:14 pm Post subject: Re: Löschen von Objekten |
|
|
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
|
Posted: Thu Jan 04, 2007 8:45 pm Post subject: Re: Löschen von Objekten |
|
|
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
|
Posted: Thu Jan 04, 2007 9:50 pm Post subject: Re: Löschen von Objekten |
|
|
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 ...
.... 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
|
Posted: Thu Jan 04, 2007 11:40 pm Post subject: Re: Löschen von Objekten |
|
|
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
|
Posted: Fri Jan 05, 2007 12:20 am Post subject: Re: Löschen von Objekten |
|
|
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
|
Posted: Fri Jan 05, 2007 3:49 pm Post subject: Re: Löschen von Objekten |
|
|
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
|
Posted: Fri Jan 05, 2007 4:36 pm Post subject: Re: Löschen von Objekten |
|
|
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
|
Posted: Fri Jan 05, 2007 4:46 pm Post subject: Re: Löschen von Objekte n |
|
|
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
|
Posted: Fri Jan 05, 2007 6:40 pm Post subject: Re: Löschen von Objekten |
|
|
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
|
Posted: Fri Jan 05, 2007 6:44 pm Post subject: Re: Löschen von Objekten |
|
|
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
|
Posted: Fri Jan 05, 2007 6:59 pm Post subject: Re: Löschen von Objekten |
|
|
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 |
|
 |
Powered by phpBB © 2001, 2006 phpBB Group
|