Run-Time Check Failure #2 - Stack around the
-
Hallo!!!
Hab ein großes Problem!! Muss ein Programm zum Datenaustausch schreiben,hab alles soweit fertig, aber nachdem die Main Funktion das return 0 ausgeführt hat kommt folgender Fehler:
Run-Time Check Failure #2 - Stack around the variable 'Programm' was corrupted.
Kann das was mit der dyn Speicherorganisierung (Arrays,..) zu tun haben???
Mein Main:
int main()
{
CController Programm; //Objekt vom Typ CController wird erstellt//Konfigurieren der Datengeneratoren, Swich und der Datensenke
Programm.createSystem("SystemConf.sys");//Startet Simulationsvorgang
Programm.simulate();return 0;
}Fehler tritt an folgender Stelle im main() auf:
return 0;
00444B4D mov dword ptr [ebp-0FCh],0
00444B57 mov dword ptr [ebp-4],0FFFFFFFFh
00444B5E lea ecx,[Programm]
00444B61 call CController::~CController (424A4Bh)
00444B66 mov eax,dword ptr [ebp-0FCh]
}
00444B6C push edx
00444B6D mov ecx,ebp
00444B6F push eax
00444B70 lea edx,ds:[444B9Bh]
00444B76 call @ILT+1860(@_RTC_CheckStackVars@8) (424749h)
00444B7B pop eax
00444B7C pop edx return 0;
00444B4D mov dword ptr [ebp-0FCh],0
00444B57 mov dword ptr [ebp-4],0FFFFFFFFh
00444B5E lea ecx,[Programm]
00444B61 call CController::~CController (424A4Bh)
00444B66 mov eax,dword ptr [ebp-0FCh]
}
00444B6C push edx
00444B6D mov ecx,ebp
00444B6F push eax
00444B70 lea edx,ds:[444B9Bh]
00444B76 call @ILT+1860(@_RTC_CheckStackVars@8) (424749h)
00444B7B pop eax -----> Hier bleibt das Programm hängen!!!!!!!!!!!!
00444B7C pop edx
-
Das da gehört eher nach Assembler. Nach dem return 0 in der main() ist dein Programm fertig und muss nur noch aufräumen (Destruktoren etc). Bei dem bisschen C++-Code kann dir keiner helfen (vielleicht aber mit dem Assembler oder der Fehlermeldung).
-
Ich glaube aber eher, dass du lieber den High-Level (also C++) Code hier posten solltest, als die Mnemonics.
Wird man dir wohl eher helfen können.
(Schließen wir hier mal Compiler und CRT-Fehler aus).
-
macht CControll nen eigen thread auf dann könnt sein dsa du des zu aprubt abrichst
kenn CControll leider netmfg
-
spjoe schrieb:
macht CControll nen eigen thread auf dann könnt sein dsa du des zu aprubt abrichst
kenn CControll leider netmfg
Kannst du bitte ein bisschen besser auf deine Rechtschreibung achten. Danke.
-
in dem assembler code steht nichts von interesse. im übrigen ist deine diagnose fehlerhaft insofern, als der fehler NICHT dort ist, wo das programm abbricht; der abbruch geschieht vielmehr dann, wenn entdeckt wird, DASS ein fehler vorliegt (wie es typisch für diese art runtime check ist). zur fehlersuche würde ich empfehlen, sich alle non-const methode anzusehen, und nat. besonders constructor und destructor. besonderes aufmerksamkeit solltest du dabei stellen widmen, bei denen das objekt Programm oder member des objekts Programm mit rohen zeigern angefasst werden - das ist nicht die einzige möglichkeit, aber mit abstand die wahrscheinlichste.
-
Hallo!!
Dank euch für die Info!!
Hab durch den Debuger den Fehler jetzt so weit eigeschränkt, dass ich weiß, dass er beim Aufruf des CopyConstruktor auftritt!
Fehler: There is no source code available for the current location.Komisch ist aber, dass kein Fehler auftritt, wenn ich mit "Step over" darüber geh. Die kopie wird erstellt und das Programm laüft bis zum Schluss weiter, wo es dann eben beim return 0 abbricht.
Will ich aber mit "Step into" in den CopyConstruktor kommt der Fehler.Ausschnitt aus meinem Programm:
CPacket* p = queue[0]; //Erstellen eines neuen Pakets vom Typ CPacket
CPacket* cpy=new CPacket(*p);for(int n=0;n<SinkNum+1;n++)
{
receiver.at(n) ->setNewPackage(cpy); //Übergeben des Pakets an CSimIF
}
queue.erase(queue.begin()); //Löschen des ersten Pakets in der Warteliste
delete p;Copykonstruktor:
CPacket::CPacket(CPacket& packet)
{
TargetAddress=packet.TargetAddress; //Kopieren der Zieladresse in neues Datenpaket
SenderAddress=packet.SenderAddress; //Kopieren der Senderadresse in neues Datenpaket
Priority=packet.Priority; //Kopieren der Priorität in neues Datenpaket
Length=packet.Length; //Kopieren der Datenblocklänge in neues Datenpaket
CheckSum=packet.CheckSum; //Kopieren der CheckSumme in neues Datenpaket//Abfrage ob Datenblocklänge >0 und Datenblockpointer ungleich 0
if((packet.Length>0) && (packet.Datablock!=0))
{
Datablock=new char [packet.Length]; //Erstellen des neuen Datenblocks//Kopieren aller Datenelemente
for(int i=0;i<packet.Length;i++)
{
Datablock[i]=packet.Datablock[i];
}
}
}
-
Fehler: There is no source code available for the current location.
Das ist kein Programmfehler. tip: englisch lernen. wenn gar nichts geht, nimm babelfish, lol
ich bezweifle, dass der copy-c'tor die ursache ist, auch wenn er möglicherweise fehlerhaft ist (Datablock wird nicht initialisiert, wenn packet zufällig mal keine daten enthält).
die kommentare sind im übrigen wenig hilfreich
-
Des oben beschriebene Problem mit "Step over" und "Step into" tritt auch bei Konstruktor auf!!
Wenn ich mit step over drüber gehe und anschließend den Datablock Pointer ansehe steht <BadPtr> dabei.
(Sorry wegen dem graußlichen Programmierstil, aber i mochs erst seit 2 Monat)Code:
CPacket* p=new CPacket(); //Erstellen eines neuen Pakets von Typ CPacket
Konstruktor:
CPacket::CPacket()
{
//Initialisiert alle Werte mit 0
TargetAddress = "";
SenderAddress = "";
Priority = 0;
CheckSum = 0;
Datablock = 0;
Length = 0;
}//Destruktor der Klasse CPacket
CPacket::~CPacket()
{
if(Datablock!=0) //Abfrage ob Datenblockpointer ungleich 0
{
delete [] Datablock; //Löschen des Datenblocks
}
}Klassendefinition:
-------------------
class CPacket
{
private:
string TargetAddress; //symbolischer Name der Zieladresse
string SenderAddress; //symbolischer Name des Absenders
int Priority; //Priorität des Pakets
int Length; //Länge des Datenblocks
char* Datablock; //Zeiger auf Datenblock
char CheckSum; //CRC-8 über den Datenblockpublic:
//Konstruktor der Klasse CPacket
CPacket();//Copyconstruktor der Klasse CPacket
//Übergabeparameter: Referenz auf den Datenpaket
CPacket(CPacket& packet);//Destruktor der Klasse CPacket
~CPacket();