myGully.com

myGully.com (https://mygully.com/index.php)
-   Programmierung (https://mygully.com/forumdisplay.php?f=67)
-   -   [C++] nicht genügent virtuellen Speicher?! (https://mygully.com/showthread.php?t=2179957)

Your_Conscience 09.12.10 19:41

[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 :rolleyes:)

germgerm 09.12.10 20:30

Hallo,
wahrscheinlich ist dein RAM fragmentiert, also Tool googlen.

Madhatter3333 09.12.10 21:36

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

Grüße MH

movpclr 09.12.10 23:07

ist deine festplatte evtl. voll?

PornoPenner 09.12.10 23:11

Bei einem "kleinen Progrämmchen" welches solch einen Fehler verursacht würde ich auch eher grobe Fehler im Code vermuten...

movpclr 09.12.10 23:14

wäre schon warscheinlicher :)

Your_Conscience 10.12.10 05:16

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. :confused:

germgerm 10.12.10 07:14

Siehe "Very large stack variables" in

[Link nur für registrierte und freigeschaltete Mitglieder sichtbar. Jetzt registrieren...]

Ich dachte, du arbeitest mit dynamischer Speicherverwaltung.

neffinator 10.12.10 08:00

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)

germgerm 10.12.10 08:08

Nein, germgerm hat leider nicht Recht, weil er vor lauter C beim derzeitigen Projekt das C++-new übersehen hat ^^

Madhatter3333 10.12.10 08:29

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

germgerm 10.12.10 08:46

"int" hat normalweise 4 byte, du meinst "unsigned short".
Also "(unsigned) int" schafft 2.147.483.647.

Your_Conscience 10.12.10 09:11

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.

germgerm 10.12.10 09:39

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

(WinXPprof & VisualC++6.0)

Your_Conscience 10.12.10 09:42

Hast du vielleicht mehr als 4GB RAM?

germgerm 10.12.10 09:45

Zitat:

Zitat von Your_Conscience (Beitrag 21635642)
Hast du vielleicht mehr als 4GB RAM?

Nein, ich habe zwei.
Also raus damit!

Edit: Mein altes Borland läuft damit auch durch.

Madhatter3333 10.12.10 10:22

Haha naja ;-)

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

Grüße MH

Your_Conscience 10.12.10 11:49

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

Madhatter3333 10.12.10 12:36

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

Banghard 10.12.10 15:44

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

[Link nur für registrierte und freigeschaltete Mitglieder sichtbar. Jetzt registrieren...]

movpclr 10.12.10 15:57

Zitat:

Zitat von Madhatter3333 (Beitrag 21636126)

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 und freigeschaltete Mitglieder sichtbar. Jetzt registrieren...]

Madhatter3333 10.12.10 18:28

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

germgerm 10.12.10 18:34

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.

movpclr 10.12.10 21:07

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!

Xalir 11.12.10 00:37

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.

germgerm 11.12.10 08:05

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.

Xalir 11.12.10 13:55

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.

germgerm 11.12.10 14:23

Zitat:

Zitat von Xalir (Beitrag 21640060)
Du Masochist :D

Echte Programmierer haben keine Angst vor gotos und verbiegen Zeiger vor dem Frühstück!

movpclr 11.12.10 14:51

im embedded bereich z.b. ist noch steinzeit... da machste das selbst^^
da gibts aber auch weniger multicores ^^

Xalir 11.12.10 14:58

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.