Re: frage zu objecten in c++

Andre Rudlaff <[email protected]>
Newsgroups gmane.linux.suse.programming
Message-ID <[email protected]>
Am Donnerstag, 17. November 2005 19:25 schrieb Johanns Schneider:
> also ich hab das gefühl es jetzt verstanden zu haben, das einzige was
> mich noch wundert ist, dass ich bei dieser main:
>
> int main()
> {
>     test *Test = new test("test, jo");
> 	//*Test = 0;	// Das nullt den Speicher des Objektes
> 	delete Test;
>     cout << "noch ist es nicht zu ende\n";
> 	Test->say();
>     return 0;
> }
>
> keine fehlermeldung bekomme,
>
> die ausgabe sieht folgendermaßen aus:
>
> test erstellt
> 0x804b028 test getoetet
> noch ist es nicht zu ende
> [leerzeile]
>

Das liegt daran:
new test reserviert Speicher auf dem Heap und gibt die Anfangsadresse an Test 
zurück.
Test enthält also nur die Adresse auf den Speicherbereich (wie jeder Zeiger 
halt)
delete Test. setzt den Speicher lediglich auf "nicht mehr reserviert" es nullt 
weder den Speicher (ist ja auch unsinnig) noch verändert es den wert der in 
Test gespeichert ist. (Der zeigt also immer noch auf die Adresse).
Und da noch niemand anderes den Speicher reserviert hat steht eben noch genau 
das selbe in dem Speicherbereich auf den Test zeigt, darum funktioniert 
test->say() auch noch.

Kannst z.B. mal nach dem delete ein variables array einfügen (z.B. mit rand(), 
feste werte, auch variablen die nicht geändert werden, optimiert der compiler 
womöglicherweise weg)
und danach mal dein Test->say() ausführen. Jetzt wirst du wohl nen 
speicherzugriffsfehler bekommen, da sich der inhalt des Speichers ja geändert 
hat.


>
> bei dieser main
>
> int main()
> {
>     test *Test = new test("test, jo");
> 	//*Test = 0;	// Das nullt den Speicher des Objektes
> 	delete Test;
>     cout << "noch ist es nicht zu ende\n";
> 	Test->say();
>     return 0;
> }
>
> lautet die ausgabe
>
> test erstellt
> noch ist es nicht zu ende
> test, jo
> 0x804b028 test getoetet
>

Wo ist der unterschied zur ersten main?

> sobald ich aber *Test=0; bzw, *Test = NULL; nicht mehr auskommentiere
> kann ich das programm nicht mehr kompilieren. (siehe alten mails)
>
*Test = 0;  wird fehlschlagen da es für die Klasse Test keinen 
zuweisungsoperator gibt der einen int in ein Test castet (er will ja hier 
versuchen Test den wert 0 zuzuweisen)

und weder *Test = 0; noch Test = 0; nullen den Speicher aus.
um den Speicher wirklich auszunullen müsstest du schreiben 
memset (Test, 0, sizeof(test));
das ist aber eigentlich unnötig den ein
Test = NULL;
setzt die Adresse die in Test gespeichert ist auf 0, daher interessiert es 
Test dann auch nicht mehr ob der ursprüngliche Zeigerbereich ausgenullt ist 
oder ob da einsen drinne stehen oder n gif Bild.
Dieses Test = NULL; hat nur den sinn solch dingen wie in der oberen main zu 
verhindern. Denn das kann zu sehr schwer zu findenden Fehlern führen.

Gruß Andre

-- 
Um die Liste abzubestellen, schicken Sie eine Mail an:
    [email protected]
Um eine Liste aller verfügbaren Kommandos zu bekommen, schicken
Sie eine Mail an: [email protected]
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.