myGully.com Boerse.SH - BOERSE.AM - BOERSE.IO - BOERSE.IM Boerse.BZ .TO Nachfolger
Zurück   myGully.com > Computer & Technik > Programmierung
Seite neu laden

[C++] nicht genügent virtuellen Speicher?!

Willkommen

myGully

Links

Forum

 
Antwort
Themen-Optionen Ansicht
Ungelesen 09.12.10, 19:41   #1
Your_Conscience
Hinter dir!
 
Registriert seit: Apr 2010
Beiträge: 1.125
Bedankt: 487
Your_Conscience ist noch neu hier! | 0 Respekt Punkte
Standard [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 )
Your_Conscience ist offline   Mit Zitat antworten
Ungelesen 09.12.10, 20:30   #2
germgerm
bla
 
Registriert seit: Mar 2010
Beiträge: 309
Bedankt: 301
germgerm ist noch neu hier! | 0 Respekt Punkte
Standard

Hallo,
wahrscheinlich ist dein RAM fragmentiert, also Tool googlen.
germgerm ist offline   Mit Zitat antworten
Ungelesen 09.12.10, 21:36   #3
Madhatter3333
Macianer
 
Registriert seit: Apr 2010
Beiträge: 139
Bedankt: 49
Madhatter3333 ist noch neu hier! | 0 Respekt Punkte
Standard

Vll. kannst du auch erstmal dein Programm posten, vll. ist da ja der Wurm drin...

Grüße MH
Madhatter3333 ist offline   Mit Zitat antworten
Ungelesen 09.12.10, 23:07   #4
movpclr
Anfänger
 
Benutzerbild von movpclr
 
Registriert seit: Nov 2010
Beiträge: 32
Bedankt: 5
movpclr ist noch neu hier! | 0 Respekt Punkte
Standard

ist deine festplatte evtl. voll?
__________________
"Durch Testen kann man stets nur die Anwesenheit, nie aber die Abwesenheit von Fehlern beweisen."
- Edsger Dijkstra
movpclr ist offline   Mit Zitat antworten
Ungelesen 09.12.10, 23:11   #5
PornoPenner
Banned
 
Registriert seit: Aug 2010
Beiträge: 209
Bedankt: 70
PornoPenner ist noch neu hier! | 0 Respekt Punkte
Standard

Bei einem "kleinen Progrämmchen" welches solch einen Fehler verursacht würde ich auch eher grobe Fehler im Code vermuten...
PornoPenner ist offline   Mit Zitat antworten
Ungelesen 09.12.10, 23:14   #6
movpclr
Anfänger
 
Benutzerbild von movpclr
 
Registriert seit: Nov 2010
Beiträge: 32
Bedankt: 5
movpclr ist noch neu hier! | 0 Respekt Punkte
Standard

wäre schon warscheinlicher
__________________
"Durch Testen kann man stets nur die Anwesenheit, nie aber die Abwesenheit von Fehlern beweisen."
- Edsger Dijkstra
movpclr ist offline   Mit Zitat antworten
Ungelesen 10.12.10, 05:16   #7
Your_Conscience
Hinter dir!
 
Registriert seit: Apr 2010
Beiträge: 1.125
Bedankt: 487
Your_Conscience ist noch neu hier! | 0 Respekt Punkte
Standard

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.
Your_Conscience ist offline   Mit Zitat antworten
Ungelesen 10.12.10, 07:14   #8
germgerm
bla
 
Registriert seit: Mar 2010
Beiträge: 309
Bedankt: 301
germgerm ist noch neu hier! | 0 Respekt Punkte
Standard

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.
germgerm ist offline   Mit Zitat antworten
Ungelesen 10.12.10, 08:00   #9
neffinator
Geschmack hadda
 
Registriert seit: Nov 2010
Beiträge: 83
Bedankt: 56
neffinator ist noch neu hier! | 0 Respekt Punkte
Standard

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)
neffinator ist offline   Mit Zitat antworten
Ungelesen 10.12.10, 08:08   #10
germgerm
bla
 
Registriert seit: Mar 2010
Beiträge: 309
Bedankt: 301
germgerm ist noch neu hier! | 0 Respekt Punkte
Standard

Nein, germgerm hat leider nicht Recht, weil er vor lauter C beim derzeitigen Projekt das C++-new übersehen hat ^^
germgerm ist offline   Mit Zitat antworten
Ungelesen 10.12.10, 08:29   #11
Madhatter3333
Macianer
 
Registriert seit: Apr 2010
Beiträge: 139
Bedankt: 49
Madhatter3333 ist noch neu hier! | 0 Respekt Punkte
Standard

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
Madhatter3333 ist offline   Mit Zitat antworten
Ungelesen 10.12.10, 08:46   #12
germgerm
bla
 
Registriert seit: Mar 2010
Beiträge: 309
Bedankt: 301
germgerm ist noch neu hier! | 0 Respekt Punkte
Standard

"int" hat normalweise 4 byte, du meinst "unsigned short".
Also "(unsigned) int" schafft 2.147.483.647.
germgerm ist offline   Mit Zitat antworten
Ungelesen 10.12.10, 09:11   #13
Your_Conscience
Hinter dir!
 
Registriert seit: Apr 2010
Beiträge: 1.125
Bedankt: 487
Your_Conscience ist noch neu hier! | 0 Respekt Punkte
Standard

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.
Your_Conscience ist offline   Mit Zitat antworten
Ungelesen 10.12.10, 09:39   #14
germgerm
bla
 
Registriert seit: Mar 2010
Beiträge: 309
Bedankt: 301
germgerm ist noch neu hier! | 0 Respekt Punkte
Standard

Bei mir läuft dein Code durch.
Der Taskmanager zeigt eine Speicherauslastung von 588.388K an.

(WinXPprof & VisualC++6.0)
germgerm ist offline   Mit Zitat antworten
Ungelesen 10.12.10, 09:42   #15
Your_Conscience
Hinter dir!
 
Registriert seit: Apr 2010
Beiträge: 1.125
Bedankt: 487
Your_Conscience ist noch neu hier! | 0 Respekt Punkte
Standard

Hast du vielleicht mehr als 4GB RAM?
Your_Conscience ist offline   Mit Zitat antworten
Ungelesen 10.12.10, 09:45   #16
germgerm
bla
 
Registriert seit: Mar 2010
Beiträge: 309
Bedankt: 301
germgerm ist noch neu hier! | 0 Respekt Punkte
Standard

Zitat:
Zitat von Your_Conscience Beitrag anzeigen
Hast du vielleicht mehr als 4GB RAM?
Nein, ich habe zwei.
Also raus damit!

Edit: Mein altes Borland läuft damit auch durch.
germgerm ist offline   Mit Zitat antworten
Ungelesen 10.12.10, 10:22   #17
Madhatter3333
Macianer
 
Registriert seit: Apr 2010
Beiträge: 139
Bedankt: 49
Madhatter3333 ist noch neu hier! | 0 Respekt Punkte
Standard

Haha naja ;-)

Gerade mal getestet: Bei mir läufts auch durch: WinXP Prof SP3 mit Visual Studio C++ 2010

Grüße MH
Madhatter3333 ist offline   Mit Zitat antworten
Ungelesen 10.12.10, 11:49   #18
Your_Conscience
Hinter dir!
 
Registriert seit: Apr 2010
Beiträge: 1.125
Bedankt: 487
Your_Conscience ist noch neu hier! | 0 Respekt Punkte
Standard

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
Your_Conscience ist offline   Mit Zitat antworten
Ungelesen 10.12.10, 12:36   #19
Madhatter3333
Macianer
 
Registriert seit: Apr 2010
Beiträge: 139
Bedankt: 49
Madhatter3333 ist noch neu hier! | 0 Respekt Punkte
Standard

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
Madhatter3333 ist offline   Mit Zitat antworten
Ungelesen 10.12.10, 15:44   #20
Banghard
Newbie
 
Registriert seit: Jun 2009
Beiträge: 74
Bedankt: 26
Banghard ist noch neu hier! | 0 Respekt Punkte
Standard

Hab deinen Code jetzt nicht selber getestet, aber hier vielleicht nen Tipp:

[ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]
Banghard ist offline   Mit Zitat antworten
Ungelesen 10.12.10, 15:57   #21
movpclr
Anfänger
 
Benutzerbild von movpclr
 
Registriert seit: Nov 2010
Beiträge: 32
Bedankt: 5
movpclr ist noch neu hier! | 0 Respekt Punkte
Standard

Zitat:
Zitat von Madhatter3333 Beitrag anzeigen

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
movpclr ist offline   Mit Zitat antworten
Ungelesen 10.12.10, 18:28   #22
Madhatter3333
Macianer
 
Registriert seit: Apr 2010
Beiträge: 139
Bedankt: 49
Madhatter3333 ist noch neu hier! | 0 Respekt Punkte
Standard

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
Madhatter3333 ist offline   Mit Zitat antworten
Ungelesen 10.12.10, 18:34   #23
germgerm
bla
 
Registriert seit: Mar 2010
Beiträge: 309
Bedankt: 301
germgerm ist noch neu hier! | 0 Respekt Punkte
Standard

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.
germgerm ist offline   Mit Zitat antworten
Ungelesen 10.12.10, 21:07   #24
movpclr
Anfänger
 
Benutzerbild von movpclr
 
Registriert seit: Nov 2010
Beiträge: 32
Bedankt: 5
movpclr ist noch neu hier! | 0 Respekt Punkte
Standard

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
movpclr ist offline   Mit Zitat antworten
Ungelesen 11.12.10, 00:37   #25
Xalir
Erfahrener Newbie
 
Registriert seit: Mar 2009
Beiträge: 154
Bedankt: 56
Xalir ist noch neu hier! | 0 Respekt Punkte
Standard

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.
Xalir ist offline   Mit Zitat antworten
Ungelesen 11.12.10, 08:05   #26
germgerm
bla
 
Registriert seit: Mar 2010
Beiträge: 309
Bedankt: 301
germgerm ist noch neu hier! | 0 Respekt Punkte
Standard

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.
germgerm ist offline   Mit Zitat antworten
Ungelesen 11.12.10, 13:55   #27
Xalir
Erfahrener Newbie
 
Registriert seit: Mar 2009
Beiträge: 154
Bedankt: 56
Xalir ist noch neu hier! | 0 Respekt Punkte
Standard

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.
Xalir ist offline   Mit Zitat antworten
Ungelesen 11.12.10, 14:23   #28
germgerm
bla
 
Registriert seit: Mar 2010
Beiträge: 309
Bedankt: 301
germgerm ist noch neu hier! | 0 Respekt Punkte
Standard

Zitat:
Zitat von Xalir Beitrag anzeigen
Du Masochist
Echte Programmierer haben keine Angst vor gotos und verbiegen Zeiger vor dem Frühstück!
germgerm ist offline   Mit Zitat antworten
Ungelesen 11.12.10, 14:51   #29
movpclr
Anfänger
 
Benutzerbild von movpclr
 
Registriert seit: Nov 2010
Beiträge: 32
Bedankt: 5
movpclr ist noch neu hier! | 0 Respekt Punkte
Standard

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
movpclr ist offline   Mit Zitat antworten
Ungelesen 11.12.10, 14:58   #30
Xalir
Erfahrener Newbie
 
Registriert seit: Mar 2009
Beiträge: 154
Bedankt: 56
Xalir ist noch neu hier! | 0 Respekt Punkte
Standard

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?
Xalir ist offline   Mit Zitat antworten
Antwort


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

BB code is An
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.

Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:14 Uhr.


Sitemap

().