Freien Speicher testen mit malloc - wie geht das genau?



  • möcht mit malloc testen wieviel byte an speicher ich zur verfügung habe darum hab ich ein char genommen und will das immer hochzählen bis ich ein null pointer zurückbekomme nur krieg ich das irgendwie nicht hin?

    int main(int argc, char* argv[]){
    char *pointer ;
    int i = 1;

    while ((pointer = malloc(i * sizeof (char))) != NULL){
    ++i;
    free(pointer);

    };
    printf("%d",i);
    return 0;
    }



  • Unter Windows wirst du damit keinen Erfolg haben, Stichwort Virtueller Speicher. Deine Anwendung bekommt auch 1GB Speicher, wenn sie ihn anfordert. Das u.U. die Hälfte davon auf der Festplatte liegt merkt die Anwendung nicht.
    Für Linux siehts wahrscheinlich ähnlich aus.

    Welches Betriebssystem benutzt du?



  • win2000
    aber wenn ich den heap teste müssts doch irgendwie hinhauen das was ich da produziert habe ist ne endlosschleife.



  • du musst eben nur warten, bis der versucht mehr als 4GB Speicher zu allokieren. Dann sollte malloc NULL liefern (unter 32Bit Systemen).

    @cd9k
    sind das nicht sogar 4GB



  • jo aber das will ich mit einer schleife testen aber im code oben ist noch irgendwo der hund drinnen kann mir mal jeman helfen ? will einfach in einer schleife immer mehr speicher allokieren und wieder freigeben bis der nullpointer zurückkommt dann weiß ich dass das max erreicht ist?



  • Ach klar, der Fehler liegt darin, dass du int als Zähler nimmst, aber 4GB entsprechen ja 4294967296byte (wenn ich mich nicht verrechnet habe) und das passt vermutlich nicht in den Integer. Benutz einfach size_t als Typ. Und du musst die Schleife eben recht lange laufen lassen.



  • okai nochmal ich hau mal den code ins rennen und unter visual.net kann man ja die heapgröße einstellen hab da mal bei heapreservierungsgröße 10000 und bei heapcommitgröße 10000 eingestellt nur hab ich keinen plan was die 10000 sind bytes viel? auf jedenfall scheint das eine endlosschleife zu sein was ich da produziert habe irgendwie muss doch das funzen????

    #include<stdio.h>
    #include<stdlib.h>

    int main(int argc, char* argv[]){

    char *pointer = NULL ;
    int n = 1;
    pointer = (char 😉 malloc(n * sizeof(char));
    free(pointer);
    while(pointer != NULL){
    pointer = (char 😉 malloc(n * sizeof(char));
    if (pointer == NULL)
    {
    printf("Kein Speicherplatz fuer x mehr frei!\nAbbruch!\n");
    }
    else{
    printf("Speicherreservierung erfolgreich!"); printf("bla %d",n);++n;
    }

    free(pointer);
    }
    return 0;
    }[cpp]



  • weißt du wie viel 4GB sind?

    das dauert ja ewig die in 1 byte schritten zu allokieren. und wenn du pech hast, kann malloc nichtmal soviel allokieren.

    nochmal ganz langsam: was du machen willst, ist blödsinn.



  • mmm so lautet eine aufgabe und darum kann man ja im .net den heap begrenzen nur check ich das irgendwie nicht so ganz! ob der code jetzt richtig ist und wie die heapbegrenzung genau funzt????????



  • kingruedi schrieb:

    @cd9k
    sind das nicht sogar 4GB

    Soweit ich weiß sind das maximal 2GB. Und zwar, wie sich das für Microsoft gehört, aus Kompatibilitätsgründen. 😃
    Früher (als 4GB absolut utopisch waren) haben manche schlauen Programmierer gemerkt, dass das höchstwertige der 32Bit eines Zeigers immer 0 ist. Logisch, solange die Adresse 2 Milliarden nicht überschreitet stimmt das.
    Daher haben die Programmierer dieses Bit als Flag missbraucht. Vor einem Dereferenzieren wurde es natürlich wieder zurückgesetzt, trotzdem begrenzt man damit den nutzbaren Speicher auf 2GB. Um auf diese Programmierer Rücksicht zu nehmen, hat M$ dafür gesorgt dass ein normales Programm niemals Speicheradressen größer als 2GB zu sehen bekommt.

    Man kann diese Grenze aber auf 3GB anheben, falls beim Linken des Programms der switch /LARGEADDRESSAWARE angegeben wurde.
    3GB ist die oberste Grenze, da der Kernel mit seinen Gerätetreibern, Memory Mapped Files usw. auch noch irgendwo hin muss.

    Ob das mit den 3GB unter Windows XP auch noch stimmt weiß ich allerdings nicht. Eigentlich dürfte sich daran nichts geändert haben. 😉



  • so meine lezter anlauf!

    ich brauch son scheiß code der funzt und schaut wieviel heap zur verfügung steht kann man ja im .net auch begrenzen muss schauen wieviels da gibt checkt das jemand? ich produzier immer ne endlosschleife??
    isse dringend


Anmelden zum Antworten