web-dev-qa-db-de.com

Wie kann ich Speicher in C freigeben?

Ich schreibe Code, der viele 1 & 2 dimensionale Arrays hat. Ich habe "Fehler: Region kann nicht zugewiesen werden" und ich denke, es liegt daran, dass zu viel Speicher zugewiesen wird. Ich benutze "malloc" und "free" Funktionen, bin mir aber nicht sicher, ob ich sie richtig benutze. Vielleicht wissen Sie, wo ich gute Beispiele zur Speicherverwaltung in C finden konnte?

also, ich versuche nur, einen Algorithmus zum Laufen zu bringen und im Moment ist dieser Code nur eine Funktion nach der anderen.

//memory allocation for 1D arrays
buffer = malloc(num_items*sizeof(double));

//memory allocation for 2D arrays
double **cross_norm=(double**)malloc(150 * sizeof(double *));
for(i=0; i<150;i++)
    {
        cross_norm[i]=(double*)malloc(num_items*sizeof(double));
    }

    //code
Window(N, window_buffer);
STFTforBMP(buffer,N,f, window_buffer);
getMagnitude(buffer,f, N, magnitude);
calculateEnergy(flux,magnitude, f);
calculateExpectedEnergy(expected_flux, candidate_beat_period, downbeat_location, f);
calculateCrossCorrelation(cross, flux, expected_values, f);
findLargestCrossCorrelation(&cross_max, cross, f);
normalizeCrossCorrelation(cross_norm, &cross_max, cross, f);
    ...............

Wie soll ich die Funktion free verwenden?

32
andrey

Sie müssen free() den zugewiesenen Speicher in genau umgekehrter Reihenfolge wie er mit malloc() zugewiesen wurde.

Beachten Sie, dass Sie den Speicher erst freigeben sollten, nachdem Sie die zugewiesenen Zeiger verwendet haben.

Speicherzuordnung für 1D-Arrays:

    buffer = malloc(num_items*sizeof(double));

Speicherfreigabe für 1D-Arrays:

    free(buffer);

Speicherzuordnung für 2D-Arrays:

    double **cross_norm=(double**)malloc(150 * sizeof(double *));
    for(i=0; i<150;i++)
    {
        cross_norm[i]=(double*)malloc(num_items*sizeof(double));
    }

Speicherfreigabe für 2D-Arrays:

    for(i=0; i<150;i++)
    {
        free(cross_norm[i]);
    }

    free(cross_norm);
42
Alok Save

Sie können Speicher in C tatsächlich nicht manuell "freigeben", in dem Sinne, dass der Speicher vom Prozess zurück an das Betriebssystem freigegeben wird ... wenn Sie malloc() aufrufen, fordert die zugrunde liegende libc-Laufzeit von an das Betriebssystem eine Speicherregion. Unter Linux kann dies durch einen relativ "schweren" Aufruf wie mmap() geschehen. Sobald dieser Speicherbereich Ihrem Programm zugeordnet ist, gibt es eine Einrichtung mit verknüpften Listen, die als "freier Speicher" bezeichnet wird und diesen zugewiesenen Speicherbereich verwaltet. Wenn Sie malloc() aufrufen, sucht es schnell im Free Store nach einem freien Speicherblock in der gewünschten Größe. Anschließend wird die verknüpfte Liste angepasst, um anzuzeigen, dass ein Teil des Speichers aus dem ursprünglich zugewiesenen Speicherpool entnommen wurde. Wenn Sie free() aufrufen, wird der Speicherblock als Knoten mit verknüpfter Liste, der angibt, dass ein Speicherblock verfügbar ist, wieder im freien Speicher abgelegt.

Wenn Sie mehr Speicher anfordern, als sich im Free-Store befindet, fordert die libc-Runtime erneut mehr Speicher vom Betriebssystem an, bis die Möglichkeit des Betriebssystems, Speicher für laufende Prozesse zuzuweisen, begrenzt ist. Wenn Sie jedoch Speicher freigeben, wird dieser nicht an das Betriebssystem zurückgegeben. In der Regel wird er wieder in den Free Store zurückgeführt, wo er von einem anderen Aufruf von malloc() erneut verwendet werden kann. Wenn Sie also häufig malloc() und free() mit unterschiedlichen Speichergrößenanforderungen aufrufen, kann dies theoretisch zu einer Bedingung führen, die als "Speicherfragmentierung" bezeichnet wird und bei der genügend Speicher vorhanden ist Speicherplatz im Free-Store zum Zuweisen des angeforderten Speicherblocks, aber nicht genug zusammenhängend Speicherplatz für die Größe des von Ihnen angeforderten Blocks. Daher schlägt der Aufruf von malloc() fehl und Sie haben praktisch nicht genügend Arbeitsspeicher, obwohl möglicherweise genügend Arbeitsspeicher als Gesamtmenge der Bytes im freien Speicher verfügbar ist.

28
Jason