Frage

Ich habe mir hier ein Beispiel angesehen:https://blog.parasoft.com/finding-memory-leaks-in-c

#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]) {
    char *string, *string_so_far;
    int i, length;     length = 0;
    for(i=0; i<argc; i++) {
        length += strlen(argv[i])+1;
        string = malloc(length+1);

        /*  * Copy the string built so far. */
        if(string_so_far != (char *)0)
            strcpy(string, string_so_far);
        else *string = '\0';
        strcat(string, argv[i]);
        if(i < argc-1) strcat(string, " ");
        string_so_far = string;
    }
    printf("You entered: %s\n", string_so_far);
    return (0);
}

und lesen Sie das, wenn wir das Programm mit den folgenden Argumenten ausführen:

hello this is a test

Die Variable string_so_far zeigt auf die Zeichenfolge „hello“, die als Ergebnis der vorherigen Schleifeniteration zugewiesen wurde.Aber ich verstehe nicht wie?Eine Schritt-für-Schritt-Erklärung wäre wirklich hilfreich.

Zweitens bin ich im Kursmaterial auf dieses Beispiel gestoßen:

int countPrimes(int n)
{
   PrimeSet *p = new PrimeSet(n);
      return( p->countPrimeNumbers() );
}

Es wurde angegeben, dass hier ein Speicherverlust vorliegt, aber ich verstehe nicht wirklich, wie das passieren kann, wahrscheinlich weil ich nicht sicher bin, was genau hier passiert.

War es hilfreich?

Lösung

Im ersten Beispiel verwenden Sie malloc innerhalb einer Schleife für eine Variable.Der malloc Der Aufruf reserviert einen Speicherblock und gibt die erste Adresse des Blocks zurück.Sie müssen löschen, um mit zu blockieren free wenn Sie es nicht mehr benötigen.Wenn der Programmierer den Speicherblock erweitern möchte, wäre dies die bessere Alternative realloc.Lesen Sie mehr über realloc bei http://www.cplusplus.com/reference/cstdlib/realloc/.

In Ihrem zweiten Beispiel das Objekt, in dem sich der Zeiger befindet p zeigt auf wird auf dem Heap initialisiert und bleibt im Heap, bis der Programmierer es verwendet delete.Eine sicherere Alternative zum Erstellen von Objekten auf dem Heap ist das Erstellen auf dem Stapel, wodurch alle Daten entfernt werden, nachdem der Aufruf einer Methode abgeschlossen ist.

int countPrimes(int n){
   PrimeSet p(n);
   return( p.countPrimeNumbers() );
}

Wenn die Speicherverwaltung nicht ordnungsgemäß durchgeführt wird, wie im zweiten Beispiel, kann das Objekt nicht gelöscht werden, nachdem der einzige Verweis darauf verloren gegangen ist, was zu einem Speicherverlust führt.

Andere Tipps

In Ihrem zweiten Beispiel ordnen Sie den Platz für ein Primeset-Objekt und initialisieren sie, dann rufen Sie die CrossPrimEnumbers-Funktion an.Das Primeset-Objekt existiert noch immer, es nimmt immer noch Speicher ein, er hat wahrscheinlich mehr Speicher zugewiesen, und der gesamte Speicher ist noch nicht belegt, aber nicht zugänglich.Das ist ein Speicherleck: Speicher, der belegt ist, aber unbrauchbar ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit cs.stackexchange
scroll top