*Test = NULL; // Das nullt den Speicher des Objektes
Um das zu machen müsstest Du den =operator überladen, da Du auf ein dereferenziertes Objekt zugreifst. Warum willst Du den Speicher 'nullen', das bringt doch nichts. Wenn Du ein delete aufgerufen hast, ist der Bereich doch wieder freigegeben (nicht ge'nullt') und der Prozess kann ihn wieder neu allokieren.
Grüße Alex
weil mir das in der liste vorher so gesagt wurde, les dir mal mein erstes post durch, dann weißt du wo mein problem ist, oder mail mir wenn du es nicht hast, dann schick ichs dir nochmal
Okay.
test Test = test(); delete &Test;
Sowas geht nicht, da Test auf dem Stack angelegt wurde und nur Gültigkeit im aktuellen Block (in Deinem Fall die main-Funktion) hat. Wenn Du explizit auf die Laufzeit Einfluss nehmen möchtest, kannst Du das nur über eine saubere new/delete Kombination machen. Es ist auch ein guter Stil, nach dem delete den Pointer(!) zu 0 zu setzen. Wenn Du danach (also Pointer ist Null) auf eine Memberfunktion zugreifst,
Test = NULL; delete Test; // hat keine Auswirkung, da Test==0 cout << "noch ist es nicht zu ende\n"; Test->say("fehler\n");
kannst Du Dich nur auf indifferentes Verhalten verlassen. In Deinem Fall funktionierte es, wahrscheinlich weil Du auch keine Variablen in der Klasse hast, die Speicher benötigen. Mit 'richtigen' Klassen sollte der Seg. Fault die Regel sein. Sowas also nie machen! Grüße Alex
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] 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 sobald ich aber *Test=0; bzw, *Test = NULL; nicht mehr auskommentiere kann ich das programm nicht mehr kompilieren. (siehe alten mails) greatz Johannes -- Es gibt 10 Arten von Menschen auf dieser Welt, die einen verstehen das Binärsystem und die anderen verstehen es nicht.
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
Am Donnerstag, 17. November 2005 19:25 begab es sich, daß Johanns Schneider folgendes in den Rechenknecht kloppte:
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]
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
Da wär mal interessant zu wissen, was denn test::say() macht.
sobald ich aber *Test=0; bzw, *Test = NULL; nicht mehr auskommentiere kann ich das programm nicht mehr kompilieren. (siehe alten mails)
Logisch, der Compiler mault dann den nicht überladenen =-Operator an.
greatz Johannes
--- Grüsse aus Meissen Jörg Pauly
participants (4)
-
Alexander Muthler
-
Andre Rudlaff
-
Johanns Schneider
-
Jörg Pauly