Willkommen |
|
myGully |
|
Links |
|
Forum |
|
|
|
 |
09.12.10, 19:41
|
#1
|
Hinter dir!
Registriert seit: Apr 2010
Beiträge: 1.125
Bedankt: 487
|
[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)
Insgesamt: 4095
Im Cache: 991
Verfügbar: 1583
Frei: 657
Wieso gibt er diese Meldung aus und kann ich etwas dagegen tun? (außer Ram aufrüsten  )
|
|
|
09.12.10, 20:30
|
#2
|
bla
Registriert seit: Mar 2010
Beiträge: 312
Bedankt: 302
|
Hallo,
wahrscheinlich ist dein RAM fragmentiert, also Tool googlen.
|
|
|
09.12.10, 21:36
|
#3
|
Macianer
Registriert seit: Apr 2010
Beiträge: 139
Bedankt: 49
|
Vll. kannst du auch erstmal dein Programm posten, vll. ist da ja der Wurm drin...
Grüße MH
|
|
|
09.12.10, 23:07
|
#4
|
Anfänger
Registriert seit: Nov 2010
Beiträge: 32
Bedankt: 5
|
ist deine festplatte evtl. voll?
__________________
"Durch Testen kann man stets nur die Anwesenheit, nie aber die Abwesenheit von Fehlern beweisen."
- Edsger Dijkstra
|
|
|
09.12.10, 23:11
|
#5
|
Banned
Registriert seit: Aug 2010
Beiträge: 209
Bedankt: 70
|
Bei einem "kleinen Progrämmchen" welches solch einen Fehler verursacht würde ich auch eher grobe Fehler im Code vermuten...
|
|
|
09.12.10, 23:14
|
#6
|
Anfänger
Registriert seit: Nov 2010
Beiträge: 32
Bedankt: 5
|
wäre schon warscheinlicher
__________________
"Durch Testen kann man stets nur die Anwesenheit, nie aber die Abwesenheit von Fehlern beweisen."
- Edsger Dijkstra
|
|
|
10.12.10, 05:16
|
#7
|
Hinter dir!
Registriert seit: Apr 2010
Beiträge: 1.125
Bedankt: 487
|
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
----------
int wi=15000,hi=10000;
----------
int* a(0);
a=new int [150000001];
int prim = wi*hi;
for (int i = 1; i <= prim; i++) {a[i]=i;}
for (int i = 2; i <= sqrt(prim); i++) {
for (int j = 2; j <= prim/i; j++) {
a[i*j]=0;}}
Das Problem scheinen die 150 Mio a's zu sein, da es mit 120 Mio noch funktioniert. Aber selbst diese 150 Mio würden doch nur 572 MB verbrauchen.
|
|
|
10.12.10, 07:14
|
#8
|
bla
Registriert seit: Mar 2010
Beiträge: 312
Bedankt: 302
|
Siehe "Very large stack variables" in
[ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]
Ich dachte, du arbeitest mit dynamischer Speicherverwaltung.
|
|
|
10.12.10, 08:00
|
#9
|
Geschmack hadda
Registriert seit: Nov 2010
Beiträge: 77
Bedankt: 56
|
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)
|
|
|
10.12.10, 08:08
|
#10
|
bla
Registriert seit: Mar 2010
Beiträge: 312
Bedankt: 302
|
Nein, germgerm hat leider nicht Recht, weil er vor lauter C beim derzeitigen Projekt das C++-new übersehen hat ^^
|
|
|
10.12.10, 08:29
|
#11
|
Macianer
Registriert seit: Apr 2010
Beiträge: 139
Bedankt: 49
|
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
|
|
|
10.12.10, 08:46
|
#12
|
bla
Registriert seit: Mar 2010
Beiträge: 312
Bedankt: 302
|
"int" hat normalweise 4 byte, du meinst "unsigned short".
Also "(unsigned) int" schafft 2.147.483.647.
|
|
|
10.12.10, 09:11
|
#13
|
Hinter dir!
Registriert seit: Apr 2010
Beiträge: 1.125
Bedankt: 487
|
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.
|
|
|
10.12.10, 09:39
|
#14
|
bla
Registriert seit: Mar 2010
Beiträge: 312
Bedankt: 302
|
Bei mir läuft dein Code durch.
Der Taskmanager zeigt eine Speicherauslastung von 588.388K an.
(WinXPprof & VisualC++6.0)
|
|
|
10.12.10, 09:42
|
#15
|
Hinter dir!
Registriert seit: Apr 2010
Beiträge: 1.125
Bedankt: 487
|
Hast du vielleicht mehr als 4GB RAM?
|
|
|
10.12.10, 09:45
|
#16
|
bla
Registriert seit: Mar 2010
Beiträge: 312
Bedankt: 302
|
Zitat:
Zitat von Your_Conscience
Hast du vielleicht mehr als 4GB RAM?
|
Nein, ich habe zwei.
Also raus damit!
Edit: Mein altes Borland läuft damit auch durch.
|
|
|
10.12.10, 10:22
|
#17
|
Macianer
Registriert seit: Apr 2010
Beiträge: 139
Bedankt: 49
|
Haha naja ;-)
Gerade mal getestet: Bei mir läufts auch durch: WinXP Prof SP3 mit Visual Studio C++ 2010
Grüße MH
|
|
|
10.12.10, 11:49
|
#18
|
Hinter dir!
Registriert seit: Apr 2010
Beiträge: 1.125
Bedankt: 487
|
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
|
|
|
10.12.10, 12:36
|
#19
|
Macianer
Registriert seit: Apr 2010
Beiträge: 139
Bedankt: 49
|
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
|
|
|
10.12.10, 15:44
|
#20
|
Newbie
Registriert seit: Jun 2009
Beiträge: 74
Bedankt: 26
|
Hab deinen Code jetzt nicht selber getestet, aber hier vielleicht nen Tipp:
[ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]
|
|
|
10.12.10, 15:57
|
#21
|
Anfänger
Registriert seit: Nov 2010
Beiträge: 32
Bedankt: 5
|
Zitat:
Zitat von Madhatter3333
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
|
das initialisert den pointer mit 0 so das er nicht auf irgend einen anderen vllt nicht mehr gültigen speicherbereich zeigt
hab ich grad noch gefunden:
[ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]
__________________
"Durch Testen kann man stets nur die Anwesenheit, nie aber die Abwesenheit von Fehlern beweisen."
- Edsger Dijkstra
|
|
|
10.12.10, 18:28
|
#22
|
Macianer
Registriert seit: Apr 2010
Beiträge: 139
Bedankt: 49
|
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
|
|
|
10.12.10, 18:34
|
#23
|
bla
Registriert seit: Mar 2010
Beiträge: 312
Bedankt: 302
|
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.
|
|
|
10.12.10, 21:07
|
#24
|
Anfänger
Registriert seit: Nov 2010
Beiträge: 32
Bedankt: 5
|
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!
__________________
"Durch Testen kann man stets nur die Anwesenheit, nie aber die Abwesenheit von Fehlern beweisen."
- Edsger Dijkstra
|
|
|
11.12.10, 00:37
|
#25
|
Erfahrener Newbie
Registriert seit: Mar 2009
Beiträge: 154
Bedankt: 56
|
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.
|
|
|
11.12.10, 08:05
|
#26
|
bla
Registriert seit: Mar 2010
Beiträge: 312
Bedankt: 302
|
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.
|
|
|
11.12.10, 13:55
|
#27
|
Erfahrener Newbie
Registriert seit: Mar 2009
Beiträge: 154
Bedankt: 56
|
Du Masochist
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.
|
|
|
11.12.10, 14:23
|
#28
|
bla
Registriert seit: Mar 2010
Beiträge: 312
Bedankt: 302
|
Zitat:
Zitat von Xalir
Du Masochist 
|
Echte Programmierer haben keine Angst vor gotos und verbiegen Zeiger vor dem Frühstück!
|
|
|
11.12.10, 14:51
|
#29
|
Anfänger
Registriert seit: Nov 2010
Beiträge: 32
Bedankt: 5
|
im embedded bereich z.b. ist noch steinzeit... da machste das selbst^^
da gibts aber auch weniger multicores ^^
__________________
"Durch Testen kann man stets nur die Anwesenheit, nie aber die Abwesenheit von Fehlern beweisen."
- Edsger Dijkstra
|
|
|
11.12.10, 14:58
|
#30
|
Erfahrener Newbie
Registriert seit: Mar 2009
Beiträge: 154
Bedankt: 56
|
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?
|
|
|
Forumregeln
|
Du kannst keine neue Themen eröffnen
Du kannst keine Antworten verfassen
Du kannst keine Anhänge posten
Du kannst nicht deine Beiträge editieren
HTML-Code ist Aus.
|
|
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:52 Uhr.
().
|