2012-06-13 10 views
11

ich eine 2-D-Matrix mit Doppelzeiger so erstellt:kostenlos ein Doppelzeiger

int** pt; pt = (int*) malloc(sizeof(int)*10); 

Ich weiß, dass ein Zeiger wie die

free(ptr); 

befreit Wie können wir den Doppelzeiger frei ?

Was passiert, wenn wir etwas drucken und später diesen Speicher freigeben und das Programm beenden? Besteht das letzte Gedächtnis aus dem, was wir benutzt haben, oder wird es dasselbe sein wie das ursprüngliche?

+3

Das hängt davon ab, wie Sie 'malloc' genannt haben. Wo ist der Code? –

+1

Sie müssen uns Code zeigen. –

+0

@bledi Sie müssen also durch diese Zeiger iterieren und die angegebenen Daten zuerst freigeben. Dann befreie die Zeiger selbst. Sieh dir Attilas Antwort an. –

Antwort

27

Sagen Sie bitte eine Matrix mat

int** mat = malloc(10 * sizeof(int*)); 
for (int i=0; i<10; ++i) { 
    mat[i] = malloc(10 * sizeof(int)); 
} 

dann kann man jede Zeile der Matrix frei (vorausgesetzt, man jede richtig vorher initialisierte) haben:

for (int i=0; i<10; ++i) { 
    free(mat[i]); 
} 

dann frei, die Top-Level-Pointer :

free(mat); 

Für Ihre zweite Frage: Wenn Sie Speicher zuordnen und benutze es, du wirst diesen Speicher ändern, der nicht "zurückgesetzt" wird, selbst wenn du ihn frei gibst (obwohl du nicht mehr zuverlässig/portabel darauf zugreifen kannst).

Hinweis: der Top-Level-malloc wird mit sizeof(int*) wie Sie Zeiger-to-int s sind Zuteilung nicht int s - die Größe von int* und int sind nicht gleich sein garantiert.

+0

danke für die Antwort. – bledi

+0

Danke Lebensretter, für diese Bestätigung – Diljeet

2

Wenn Ihre Matrix nicht „zackig“ ist, dh alle Zeilen die gleiche Länge haben, könnten Sie in Erwägung ziehen:

  1. es manuell Zugriff, dh nur behandeln es als ein 1D-Array von Werten und Halten Sie einen separaten width Wert. Um auf ein Element unter (x, y) zuzugreifen, verwenden Sie mat[y * width + x].
  2. Wenn Sie wirklich die Bequemlichkeit der mat[y][x] möchten, können Sie es verbessern, indem sie einen einzigen Anruf zu malloc() zu tun, dass beide der Zeiger Array ordnet und alle Zeilen, dann die Zeiger initialisiert in jeder Zeile zu zeigen. Dies hat den Vorteil, dass alles kostenlos sein kann: ed mit einem einzigen free(mat); Anruf.

Der zweite Ansatz würde wie folgt aussehen:

double ** matrix_new(size_t width, size_t height) 
{ 
    double **p = malloc(height * sizeof *p + width * height); 
    double *e1 = (double *) (p + height); 
    size_t i; 

    for(i = 0; i < height; ++i) 
    p[i] = e1 + i * width; 
    return p; 
} 

Hinweis: Die oben ungeprüfte ist, und die Produktion Code sollte offensichtlich für Fehler überprüfen, bevor p verwenden.

+2

Wenn Sie nur den Zeiger der höchsten Ebene freigeben, werden die Puffer, auf die die interne Ebene verweist, nicht referenziert, werden sie standardmäßig von einem Garbage Collector freigegeben ????. oder sie sollten explizit befreit werden ??? –