"unknown software exception"

july

Erfahrenes Mitglied
Hallo zusammen,

ich hab mal wieder einen kommischen Fehler. Sobald ich ein bestimmtes Objekt in meiner main()-Funktion deklariere, stürzt mein ganzes Programm mit folgender Fehlermeldung ab:
Die Ausnahme "unknown software exception" (oxc00000fd) ist in der Anwendung an der Stelle 0x00412072 aufgetreten.
C++:
int main()
{
....
unsigned long zentralenId;
srand(time(NULL));
zentralenId = (unsigned long) rand();
Meldungsspeicher msp(zentralenId);
....
}

C++:
Meldungsspeicher::Meldungsspeicher(unsigned long zentralennr){
zentralenNr = zentralennr;
	initMap(zentralennr);

}

void Meldungsspeicher::initMap(unsigned int zentralennr) {
	string filename;
	FILE* file;
	unsigned long fSize;
	size_t result;
	meldung_t defaultm;
	unsigned int counter;
	filename = zentralenNr + ".txt";
	file = fopen(filename.c_str(), "r");
	if (file != NULL) //Datei existiert, es gibt schon alte Meldungen, die ausgelesen werden muessen
	{
		cout << "Einlesen der Datei.." << endl;
		fseek(file, 0, SEEK_END);
		fSize = ftell(file);
		rewind( file);
		// copy the file into the buffer:
		result = fread(&melMap, 1, fSize, file);
		if (result != fSize) {
			cout<<"Reading error: " << stderr;
		}

		fclose(file);
	} else {
		defaultm.kat = Default_kat;
		defaultm.gruppe = 0;
		defaultm.loeschBereich = 0;
		defaultm.melCode = 0;
		defaultm.meldArt = DEFAULT;
		defaultm.melder = 0;
		defaultm.msgId = 0;
		melMap.clear();
		for (counter = 1; counter < UINT_MAX; counter++) {
			melMap.insert(make_pair(counter, defaultm));
		}
	}
}

Habt ihr vielleicht eine Idee woran es liegen könnte?

Grüße July
 
Zuletzt bearbeitet von einem Moderator:
hab den Fehler gefunden. Die Deklaration des Objektes muss anders aussehen:

C++:
...
Meldungsspeicher *msp;
...
msp= new Meldungsspeicher(zentralenId);
...

Was ich noch nicht so ganz verstehe warum muss es ein Pointer auf das Objekt sein und warum geht die andere Lösung nicht?
 
Zuletzt bearbeitet von einem Moderator:
C++:
#define STATUS_STACK_OVERFLOW            ((DWORD   )0xC00000FDL)

Du erhälst eine Exception weil die Grösse des Stacks zu gross wurde. Offensichtlich ist deine Klasse Meldungsspeicher ziemlich gross und in der ersten Variante wird das Objekt auf dem Stack der main-Funktion abgelegt, in der zweiten Variante wird nur die Grösse eines Pointers auf den Stack gelegt, der Rest wird auf dem Heap alloziert.
 
Hm... Kann ich irgendwie die Größe des Stacks erweitern oder iwie schaffen das objekt auf dem Stack abzulegen?
 
Wie sieht denn die Klasse momentan aus? Muss ja wohl relativ viel Speicher in Anspruch nehmen.
 
Also eigentlich hab ich genug Speicher, mir ist halt wichtig, dass alle Arrays und die Map im Stack und nicht auf dem heap liegen....

C++:
#define UINT_MAX			1000000

class Meldungsspeicher
{
	//unsigned int
	// ---  Daten ---
public:
	unsigned long zentralenNr;
	MeldungsMap melMap;
	MeldungsMap *sortMap;
	MeldungsMap::iterator it,ilb, ir;
	unsigned int idsortArr[UINT_MAX];
	unsigned int katsortArr[UINT_MAX];
	unsigned int timestampArr[UINT_MAX];
	unsigned int meldungsCounter;
	unsigned int kategorieCounter[KATEGORIENANZAHL];
private:
	// --- Methoden ---
private:
void initMap(unsigned int zentralennr);
void arrayLeeren(unsigned int oldarr[],unsigned int *arr);
void getNextKatMeld(unsigned int actMeldId, meldung_t *next);

public:
	Meldungsspeicher(unsigned long ZentralenId);
	~Meldungsspeicher();
	int addMessage(meldung_t meldung); // gibt die msgid zurück
	meldung_t *getMessage(unsigned int msgID);
	int deleteMessage(int msgid);
	void sort(sortParam param);
	int sortIds(unsigned int idsortArr[]);
	void quicksortKat(unsigned int sortArr[], int left, int right);
	int getFirstMeldKat(kategorie_t kategorie, meldung_t *meld);
	int getKatCounter(kategorie_t kategorie);
	//TODO: untere Methoden implementieren
	//int getMeldKat(unsigned int meldId, meldung_t *meld);
	int getLastMeldKat(meldung_t *meld);
	int quicksortTimestamps(unsigned int sortArr[], int left, int right);
};
 
Zuletzt bearbeitet von einem Moderator:
Warum ist das denn wichtig? Diese Klasse wirst du nie im Leben auf den Stack bringen.
Diese drei Elemente:
C++:
    unsigned int idsortArr[UINT_MAX];
    unsigned int katsortArr[UINT_MAX];
    unsigned int timestampArr[UINT_MAX];

Brauchen zusammen schon 48GB an Speicher. Es wundert mich überhaupt, dass du eine Instanz der Klasse über new erstellen kannst. Hast du so viel RAM?
 
also ich hab gerade gerechnet und für diese 3 Arrays brauche ich ca.12 MBytes.
Ich weiß nicht wie du rechnest, ich hab
4Bytes(unsigned int) * 1000000 (Größe des Arrays) * 3 (Anz. der Arrays) = 12.000.000 = ca. 12 MegaBytes
Und ich hab 1Gbyte RAM zur Verfügung, das reicht doch locker ;-)
 
Hi

also ich komm auch auf 12 MB.
Vielleicht ist Muepe durch das UINT_MAX irregeführt worden,
das gibts nämlich schon und ist ((2^32)-1).

Damit da nicht irgendwann Probleme auftreten
(sobald du den Header mit dem offiziellen UINT_MAX einbindest)
solltest du die Konstante anders nennen.

Zum Stack: Egal, wieviel RAM du hast, der Stack wird trotzdem nicht alles verwenden.
Ist und bleibt begrenzt und ist hauptsächlich für einzelne lokale Variablen,
Parameterübergben, Returnwerte etc. gedacht.
12MB sind da schon etwas viel.

Gruß
 
Also, dass die Arrays im Heap liegen werden bin ich noch bereit zu akzeptieren, aber die Map muss auf dem Stack liegen, ist in der DIN-Norm vorgeschrieben....
 
Zurück