Fehler mit dem Speicher -> wo ist der fehler ?
-
beim ausführen gibt es ein problem am beste selber angucken
cpp
#include "WorkerUmlaute.h" #include "DynamicArray.h" DynamicArray DArray(0); void CreateWorker(); bool menu(); int main() { while(menu()!=true) { menu(); } cout << "Aufwiedersehen!"<<endl; return 0; } void CreateWorker() { Worker newWorker; DArray.push(newWorker); system("cls"); } bool menu() { bool fQuit = false; int cChoice; cout << "1. Arbeiter anzeigen"<<endl << "2. Arbeiter erzeugen"<<endl << "0. Beenden"<<endl<<endl << "Auswahl: ";cin>>cChoice; switch(cChoice) { default: fQuit = true; break; case 1: break; case 2: system("cls"); CreateWorker(); break; case 0: fQuit = true; break; } return fQuit; }
.h
class DynamicArray { private: int ERHOEHEN; Worker *pWorker; int topIndex; int max; public: DynamicArray(int Startwert) { ERHOEHEN = 5; max = Startwert; pWorker = new Worker[max]; topIndex = -1; }; ~DynamicArray() { delete [] pWorker; }; void push(Worker arbeiter) { topIndex++; if(topIndex == max) { Worker* tmp = pWorker; max += ERHOEHEN; pWorker = new Worker[max]; for(int i=0; i<topIndex; i++) pWorker[i] = tmp[i]; delete [] tmp; } pWorker[topIndex] = arbeiter; }; };
.h
#include <iostream> #include <string> #include <windows.h> using namespace std; namespace Umlaut { const unsigned char AE = static_cast<unsigned char>(142); const unsigned char ae = static_cast<unsigned char>(132); const unsigned char OE = static_cast<unsigned char>(153); const unsigned char oe = static_cast<unsigned char>(148); const unsigned char UE = static_cast<unsigned char>(154); const unsigned char ue = static_cast<unsigned char>(129); const unsigned char ss = static_cast<unsigned char>(225); } class Worker { private: int *Selery; int *Age; string *Vname; string *Nname; public: Worker(); ~Worker(); Worker(const Worker&); Worker& operator=(const Worker&); void SetSelery(int SSele) { *Selery = SSele; } void SetAge(int SAge) { *Age = SAge;} void ChangeVname(string SVname) { *Vname = SVname; } void ChangeNname(string SName) { *Nname = SName; } int GetSelery() const { return *Selery;} int GetAge() const { return *Age; } string GetVname() const { return *Vname; } string GetNname() const { return *Nname; } }; Worker::Worker() { Selery = new int; Age = new int; Vname = new string; Nname = new string; cout << "Vorname: ";cin >> *Vname; cout << "\nNachname: ";cin >> *Nname; cout << "\nLohn: ";cin >> *Selery; cout << "\nAlter: ";cin >> *Age; cout << endl; system("cls"); } Worker::~Worker() { delete Selery; delete Age; delete Vname; delete Nname; *Selery=0; *Age=0; } Worker::Worker(const Worker& rhs) { initialisieren this->operator=(rhs); } Worker& Worker::operator =(const Worker& rhs) { if(this == &rhs) return *this; delete Selery; delete Age; delete Vname; delete Nname; Selery = new int; Age = new int; Vname = new string; Nname = new string; *Selery = rhs.GetSelery(); *Age = rhs.GetAge(); *Vname = rhs.GetVname(); *Nname = rhs.GetNname(); return *this; }
-
Worker::Worker(const Worker& rhs)
{
initialisieren //<----- weg das war ein kommentar ^^
this->operator=(rhs);
}
-
quahle schrieb:
am beste selber angucken
Ne, lass mal.
Wo gibts den Fehler? Fehlermeldung?
-
Debug Asseration Failed!
File: dbgheap.c
Line: 1011Expression: _CrtIsValidHeapPointer(pUserData)
-
mach dir erstmal die mühe, und kreis mittels debuger und test ausgaben den fehler ein. ist die einzige möglichkeit da ranzukommen.
-
habs mittels auskommentieren probiert doch ich komme nicht dahinter
-
quahle schrieb:
habs mittels auskommentieren probiert doch ich komme nicht dahinter
Dann wirf den Debugger an, das ist die nächste Stufe; der sagt Dir ggf. auch wo segfaults auftreten.
-
fehler gefunden...
Worker::~Worker() { delete Selery; delete Age; delete Vname; delete Nname; *Selery=0; *Age=0; }
zugriff auf selery/age nachdem der speicher freigegeben wurde ist irgendwie hirnrissig...
und der op= ist mir auch nicht geheuer...
-
hm sollte man nicht nach dem löschen eines zeiger in auf 0 setze ?
-> fehler ist tortzdem noch nicht behoben
aber danke schonmal
debuger sagt
Nicht abgefangene Ausnahme in DArrayMain.exe (KERNEL32.DLL): 0xC0000005: Access Violation.
Das Programm wurde mit Code 3 (0x3) beendet.
-
hm sollte man nicht nach dem löschen eines zeiger in auf 0 setze ?
a) da spassiert normalerweise automatisch
b) das was du gemacht hast, war den inhalt des zeigers auf 0 zu setzen//edit kannst du uns wenigstens sagen, was du im programm machst, damit es einstürzt? zb ob du die arbeiter anzeigst, doer einen neuen erstellst.
-
huh !
ok, aber was ist nun der fehler ?
könnt ihr mir bitte helfen ?
ich habe mich schon lange damit befasst und melde mich jetzt im forum weil ich echt 0 ahnung hab was los is
-
was machst dud enn, damit das programm abstürzt?
bisher hast du uns so ca 0 infos gegeben-.-
-
einfach einen erstellen
-
Ich erstelle einen einfach und das programm stürtz danach sofort ab
-
hmm dacht ich mir.
ok, mach mal aus:
DynamicArray DArray(0);
ein
DynamicArray DArray(1);nur als test.
-
das gleiche... nachdem der konstrukter aufgerufen wird und ich im menü einen hinzufügen will stürtzt es wieder ab.
der Array sollte eigentlich sich automatisch vergrößern, wenn nicht genügend speicher vorhanden ist
/* Code dazu steht bei dynamicArray.h methode lautet push(worker arbeiter)*/
-
hab den fehler jetzt. Debugger benutzen hilft.
erstmal tu ich das, was ich die ganze zeit tun wollte: ich leg dich übers knie, weil du einzelne ints auf den heap sperrst.Und nun zum grund:
du benutzt ein array. Daran ist erstmal nichts schlimmes. Aber der teufel liegt nunmal im detail:pWorker = new Worker[max];
das ruft keinen ctor auf,du hast also ganz viele pointer die auf nichts zeigen.
das nächste was passiert ist, dass du den op= für die Klasse aufrufst.
dh, du rufst für pointer, die auf 0 zeigen delete auf, und das macht richtig aua.
dazu muss ich dich nochwas fragen: wieso rufst du für die pointer erst delete auf? was spricht dagegen, den speicherplatz wiederzuverwenden?hier die fehlerfreie workerklasse
class Worker{ private: int Selery; int Age; string Vname; string Nname; public: Worker(); ~Worker(); Worker(const Worker&); Worker& operator=(const Worker&); void SetSelery(int SSele) { Selery = SSele; } void SetAge(int SAge) { Age = SAge;} void ChangeVname(string SVname) { Vname = SVname; } void ChangeNname(string SName) { Nname = SName; } int GetSelery() const { return Selery;} int GetAge() const { return Age; } string GetVname() const { return Vname; } string GetNname() const { return Nname; } }; Worker::Worker(){ cout << "Vorname: ";cin >> Vname; cout << "\nNachname: ";cin >> Nname; cout << "\nLohn: ";cin >> Selery; cout << "\nAlter: ";cin >> Age; cout << endl; system("cls"); } Worker::~Worker(){} Worker::Worker(const Worker& rhs) { this->operator=(rhs); } Worker& Worker::operator =(const Worker& rhs) { if(this == &rhs) return *this; Selery = rhs.GetSelery(); Age = rhs.GetAge(); Vname = rhs.GetVname(); Nname = rhs.GetNname(); return *this; }
die variablen musst du garnicht auf den heap sperren, da dein array eh auf dem heap liegt. string speichert seinen inhalt automatisch auf den heap, und int ist zu klein, um ein platz problem zu werden.
-
ok vielen dank
-
otze schrieb:
hm sollte man nicht nach dem löschen eines zeiger in auf 0 setze ?
a) da spassiert normalerweise automatisch
Ach ja? Das wäre mir neu.
Zeiger auf null zu setzen, wenn sie nicht mehr gebraucht werden, macht keinen Sinn.otze schrieb:
dh, du rufst für pointer, die auf 0 zeigen delete auf, und das macht richtig aua.
Nee, macht es nicht.