kein absturz bei dev gcc
-
hallo leute,
dieses programm soll abstürzen, wenn der zweite
destructor für "paul" aufgerufen wird.
Da der erste destructor von peter, den speicherbereich
löscht, auf den peter und paul zugreifen. Bei den
aufruf des destructors für paul ist dann der speicher
nicht mehr vorhanden und das war?s dann gewesen.
Unter microsoft stürzt es ab, bei den bloodshed
c-compiler (vers. 10.9.8.10) stürzt er nicht ab.
Wieso??? Gruß karsten#include <iostream>
using namespace std;
class Person
{
public:
Person();
~Person();
int *pAlter;
};
Person::Person()
{
pAlter=new int;
*pAlter=25;
cout << "konstructor!" << endl;
}
Person::~Person()
{
delete pAlter;
cout << "destructor!" << endl;
}
int main()
{
Person peter;
cout << "peter ist: " << *(peter.pAlter) << "
jahre alt" << endl;
paul.operator = (peter);
cout << "peter ist: " << *(peter.pAlter) << "
jahre alt" << endl;
cout << "paul ist: " << *(paul.pAlter) << " jahre
alt" << endl;
*(peter.pAlter)=13;
cout << "peter ist: " << *(peter.pAlter) << "
jahre alt" << endl;
cout << "paul ist: " << *(paul.pAlter) << " jahre
alt" << endl;
//system("PAUSE");
return 0;
}BILDSCHIRMAUSGABE
konstructor!
peter ist: 25 jahre alt
peter ist: 25 jahre alt
paul ist: 25 jahre alt
peter ist: 13 jahre alt
paul ist: 13 jahre alt
destructor
destructor[cpp]
-
undefiniertes verhalten heisst: es kann alles passieren. oft bedeutet es absturz - aber nicht immer.
-
paul ist nirgends deklariert. Bist du sicher, dass das das richtige Programm ist? BTW, würdest du das Programm in code-Tags einfassen? [ cpp] .... [/ cpp]
-
hier eine berichtigte und abgespeckte version des programms, bei dir fehlt die instanz von paul
dieses programm stürzt im studio - weil zweimal der destruktor die gleiche stelle "deleten" will - ab.
wie ist es mit dem dev?#include <iostream> using namespace std; class Person { public: Person(); ~Person(); int *pAlter; }; Person::Person() { pAlter=new int; *pAlter=25; cout << "konstructor!" << endl; } Person::~Person() { delete pAlter; cout << "destructor!" << endl; } int main() { Person peter; Person Paul(peter); }
-
int main() { { Person peter; Person Paul(peter); getch(); } getch(); }
... schluckt Dev-C++ 4.9.8.10 problemlos und druckt einmal ctor und zweimal dtor aus.
-
Herzlichen Glückwunsch!
Sie haben soeben den Heap zerlegt.
-
genau ist ja das problem:
der dev cpp sollte an der stelle irgendwie reagieren. tut er aber nicht.ok, undefiniertes verhalten. er verhält sich eben ruhig
-
da lohnt es sich nicht viel rumzurätseln. Geht eben gerade in dem Moment. Aber versuch doch mal nach dem dtor aufruf noch irgend was mit dem Heap anzustellen oder reservier mal vorher ein bisschen Speicher. Wenn du willst bekommst du es dann auch hin, dass du mit nem SegFault rausfliegst.
Dann weisst du auch, warum Undefined Behaviour vermieden werden sollte, weil es nicht nur von der Lust des Compilers abhängt dir den Code um die Ohren zu hauen, sondern weil tausende Faktoren da eine Rolle spielen, was passiert.
-
LiquidAcid schrieb:
Herzlichen Glückwunsch!
Sie haben soeben den Heap zerlegt.
Kann mir wer erklätren warum?
Ich kenn mioch da noch nicht so aus.
-
Dann guck in die C++ FAQ Lite