![]() |
[C++] nicht genügent virtuellen Speicher?!
Ich habe ein kleines Progrämmchen geschrieben, welches leider während der Laufzeit abbricht und die Meldung "Für diesen Befehl ist nicht genügend Speicher verfügbar" ausgibt.
Mein erster Gedanke war: "Jo.. wohl nicht genügend Arbeitsspeicher..". Ein kontrollierender Blick in den Taskmanager sagt aber (meinem Anschein nach) etwas anderes aus. Code:
Physikalischer Speicher (MB) |
Hallo,
wahrscheinlich ist dein RAM fragmentiert, also Tool googlen. |
Vll. kannst du auch erstmal dein Programm posten, vll. ist da ja der Wurm drin...
Grüße MH |
ist deine festplatte evtl. voll?
|
Bei einem "kleinen Progrämmchen" welches solch einen Fehler verursacht würde ich auch eher grobe Fehler im Code vermuten...
|
wäre schon warscheinlicher :)
|
Also mein RAM scheint nicht defragmentiert zu sein, da "RAM Defrag" nichts freiräumt und auf meiner internen Festplatte habe ich auch noch über 600Gb frei.
Hier der Teil des Codes, der den Fehler verursacht. Code:
#include < math.h> // das Leerzeichen vor dem "m" muss hier sein, da er sonst alles dahinter ausblendet |
Siehe "Very large stack variables" in
[Link nur für registrierte und freigeschaltete Mitglieder sichtbar. Jetzt registrieren...] Ich dachte, du arbeitest mit dynamischer Speicherverwaltung. |
germgerm hat recht, daran liegts imo, gibt aber zB in java spezielle bibliotheken, die das problem lösen (ich denk mal in c++, also für dein programm auch)
manche entwicklungsumgebungen haben auch ne option in der man fehler solcher art ignorieren kann (is aber allgemein nicht zu empfehlen) |
Nein, germgerm hat leider nicht Recht, weil er vor lauter C beim derzeitigen Projekt das C++-new übersehen hat ^^
|
Täusche ich mich oder ergibt die Zeile:
int prim = wi*hi eine Zahl jenseits der 15 Mio? Leider hat eine int-Variable den Max.Wert 65000 und irgendwie paar zerquetschte... ;-) Grüße MH |
"int" hat normalweise 4 byte, du meinst "unsigned short".
Also "(unsigned) int" schafft 2.147.483.647. |
Es geht hier auch um 150 Mio und nicht um 15 Mio :)
Integer hat einen Wertebereich von −2.147.483.648 bis +2.147.483.647 Unsignet Integer von 0 bis 4.294.967.295. Da 2 Mrd aber mehr als 150 Mio sind, kann es daran eigentlich nicht liegen. |
Bei mir läuft dein Code durch.
Der Taskmanager zeigt eine Speicherauslastung von 588.388K an. (WinXPprof & VisualC++6.0) |
Hast du vielleicht mehr als 4GB RAM?
|
Zitat:
Also raus damit! Edit: Mein altes Borland läuft damit auch durch. |
Haha naja ;-)
Gerade mal getestet: Bei mir läufts auch durch: WinXP Prof SP3 mit Visual Studio C++ 2010 Grüße MH |
Jop, mit dem Visual Studio C++ 2010 läuft es bei mir auch durch. (WFT)
Win 7 Uktimate x64 Macht man aus den 150 Mio aber eine 1 Mrd, wird hier erst garnicht compiliert :D |
Mal was anderes, weil ich auch im Moment am C++ Programmieren bin in der HS:
Eine geklammerte 0 hinter der Pointerdefinition int* a(0); Was bewirkt die den? Hab ich so noch nie gesehen oder benutzt... Soll das ein Konstruktor werden oder so? XD Grüße MH |
Hab deinen Code jetzt nicht selber getestet, aber hier vielleicht nen Tipp:
[Link nur für registrierte und freigeschaltete Mitglieder sichtbar. Jetzt registrieren...] |
Zitat:
hab ich grad noch gefunden: [Link nur für registrierte und freigeschaltete Mitglieder sichtbar. Jetzt registrieren...] |
verrückt...ich kenn das nur mit int * a = NULL; ^^Das man das "wie mit nem Konstruktor" machen kann wusste ich nicht. Verstehe den Vorteil von der Klammerung, bzw. den Nachteil der = NULL Schreibweise nit ^^ Aber warscheinlich gibts da keinen ^^
Grüße MH EDIT: Nen Kurs über Pointer brauch ich aber dann trotzdem nich :P |
Ob du die Null zuweist oder in der Klammer übergibst macht überhaupt keinen Unterschied. Ein moderner Compiler macht damit sowieso was er will.
Und wie NULL definiert ist, weiß auch der Compiler. Ich nehme meist 0. |
ein pointer der mit NULL initialisiert wird zeigt nirgends hin im gegensatz zu einem der mit 0 initialisiert ist
es sei den du legst anfags per #define fest das NULL 0 ist. aber in c++ ist die benutzung von NULL laut stroustrup nicht so sauber. hau rein! |
Bei Objekten ist es nicht ungewöhnlich, diese mit null zu initialisieren bzw. zu dereferenzieren, da man dadurch prüfen kann ob das Objekt initialisiert oder überhaupt noch existent ist.
Ich weiß nicht, ob C++ einen GC hat, aber von VB.NET,C# und perl kenne ich dies zumindest so, dass der GC dann automatisch über alle derefenzierten Objekte geht und diese endgültig aus dem Speicher haut. |
Nein, C++ hat grundsätzlich keinen garbage collector. Fremdfirmen bieten aber welche an.
Ich bin froh, dass ich bei C++ meinen Speicher wirklich freigeben kann, wann ich will. |
Du Masochist :D
Bis vor wenigen Jahren hätte ich Dir zugestimmt, aber heutzutage sind die GC's meiner Meinung nach der manuellen Speicherverwaltung weit überlegen und dank Multicores auch performancemäßig kein Killer mehr. |
Zitat:
|
im embedded bereich z.b. ist noch steinzeit... da machste das selbst^^
da gibts aber auch weniger multicores ^^ |
Ohh hör mir auf, das letzte mal wo ich das böse Wort mit 4 Buchstaben eingesetzt habe, war auf dem Brotkasten. Hach, waren das noch Zeiten wo man direkt auf den Speicher arbeiten und seine Zeilennummern noch selbst schreiben musste. Und man vor lauter Gosubs und Gotos sich in den Zeilennummern verzettelt hat.
Heutzutage verbiege ich vorm Frühstück Löffel. Zählt das auch? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:37 Uhr. |
Powered by vBulletin® (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.