Forum: PC-Programmierung Visual Studio MFC, CMemoryException beim allozieren


von A. R. (redegle)


Lesenswert?

Hallo,

ich Programmier in Microsoft Visual Studio 2010 mit der MFC (C++).
Der Programmcode ist wie folgt:
1
char * Datenpaket;
2
Datenpaket = new char[Zeilen*Bytes_pro_Zeile];
3
//Zeilen*Bytes_pro_Zeile=1204362950 Bytes bzw. 1,12 GB

Beim Aufruf von new bricht der Debugger mit der folgenden Fehlermeldung 
ab:

"Unbehandelte Ausnahme bei 0x76ef15de in Projekt1.exe: Microsoft 
C++-Ausnahme: CMemoryException an Speicherposition 0x002aeef8."

Dabei springt er in die Funktion
1
inline void* CThreadSlotData::GetThreadValue(int nSlot)
an die Stelle:
1
return pRetVal;

In der Datei afxtls.cpp

Arbeitsspeicher 8 GB
Betriebssystem Win 7
3,4GB belegt zum Programmstart

Kann mir jemand erklären, wiso das Programm manchmal abstürzt?

von Peter II (Gast)


Lesenswert?

A. R. schrieb:
> Kann mir jemand erklären, wiso das Programm manchmal abstürzt?

es stürzt nicht ab, es wirft eine Exception. Es schein kein 
zusammenhängender Speicher für 1,2GB mehr da zu sein.

Baust du eine 32bit oder 64bit Version?

von A. R. (redegle)


Lesenswert?

Danke für die Antwort. An die Möglichkeit habe ich nicht gedacht.

Betriebssystem hat 64 Bit.

Bei der Exception bekomme ich die Möglichkeit auf weiter oder auf 
Unterbrechen zu klicken.


Klicke ich auf weiter kommt die Meldung:

"Unbehandelte Ausnahme bei 0x76ef15de in Projekt1.exe: 0x00000000: Der 
Vorgang wurde erfolgreich beendet."

Wenn ich hier auf Weiter klicke widerhohlt sich die Meldung ständig. Ist 
das so gewollt?

Sollte kein zusammenhängender Speicher vorhanden sein hätte ich 
zumindest erwartet, dass new eine NULL zurückgibt. In diesem Fall könnte 
ich ggf. auf das Problem reagieren.

von Peter II (Gast)


Lesenswert?

A. R. schrieb:
> Danke für die Antwort. An die Möglichkeit habe ich nicht gedacht.
> Betriebssystem hat 64 Bit.

das wollte ich nicht wissen, du musst doch wissen ob du dir eine 64bit 
Anwendung oder eine 32bit Anwendung braust. - wenn du es nicht weist 
dann wird es wohl eine 32bit Anwendung sein. Dort kannst du nur 
insgesamt 2GB Speicher bekommen. Wenn du auch noch 1,2GB auf einmal 
haben willst wird es wohl oft schief gehen.

> Wenn ich hier auf Weiter klicke widerhohlt sich die Meldung ständig. Ist
> das so gewollt?
naja, was soll sonst noch passieren, es gibt kein sinnvolles weiter 
machen mehr.

> Sollte kein zusammenhängender Speicher vorhanden sein hätte ich
> zumindest erwartet, dass new eine NULL zurückgibt. In diesem Fall könnte
> ich ggf. auf das Problem reagieren.
du Programmierst aber C++ dort gibt es Exceptions, diese muss man mit 
try catch behandeln.

bei malloc würde eine NULL zurückkommen, aber bei new gibt eine 
Exception.

von A. R. (redegle)


Lesenswert?

>das wollte ich nicht wissen, du musst doch wissen ob du dir eine 64bit
>Anwendung oder eine 32bit Anwendung braust.

Aktuell ist es eine 32bit Anwendung.

>Dort kannst du nur insgesamt 2GB Speicher bekommen. Wenn du auch noch 1,2GB auf 
>einmal haben willst wird es wohl oft schief gehen.

Das eigentliche Programm benötigt nur wenige MB.

>bei malloc würde eine NULL zurückkommen, aber bei new gibt eine
>Exception.

Danke für den Hinweis. Das wusste ich nocht nicht!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.