2010-12-02 2 views
0
  int n; 
      int **arr; 
      arr = (int**)malloc(n*sizeof(int)); 
      for (i=0; i<n; ++i){ 
      arr[i] = malloc(2*sizeof(int)); 

      } 

[EDIT]wie die Zuweisung der Speicher auf den Malloc im folgenden Code freigeben?

 *** glibc detected *** ./abc: double free or corruption (out): 0x0000000002693370 
======= Backtrace: ========= 
/lib/libc.so.6(+0x775b6)[0x7f42719465b6] 
/lib/libc.so.6(cfree+0x73)[0x7f427194ce53] 
./abc[0x405f01] 
/lib/libc.so.6(__libc_start_main+0xfd)[0x7f42718edc4d] 
./abc[0x400ee9] 
======= Memory map: ======== 
00400000-00416000 r-xp 00000000 08:07 392882        
00616000-00617000 r--p 00016000 08:07 392882 

ich mit den folgenden genannten Antworten versucht, aber ich habe die folgenden oben genannten error.What der Grund dafür sein?

[EDIT]

Das oben erwähnte Problem ist nun behoben. Da war ein Fehler im Code. Nun, was ich nicht bekomme, ist eine Verbesserung des freigewordenen Gedächtnisses. Was kann der Grund dafür sein?

[EDIT] ich einige Module bin mit dem memory.following drucken ist, den Code

 memory_Print(); 
    #ifdef CHECK 
    memory_PrintLeaks(); 
     #endif 

Hier memory_PrintLeaks() druckt den geforderten Speicher und befreit memory.I den gleichen Wert ist immer die Änderungen nach der Herstellung. Eine weitere Bemerkung, die ich hinzufügen möchte, ist, kann ich die freie() irgendwo aus dem Programm aufrufen oder es ist erforderlich, von einigen bestimmten Orten wie der Ort, an dem der malloc() aufgerufen wurde oder an der Ende des Programms?

+3

Sie haben einen Fehler. Das erste "malloc" reserviert Platz für "Zeiger", nicht "Ints". Der Funktionsaufruf sollte 'malloc (n * sizeof (int *)) sein' – Blastfurnace

+0

ja, es funktionierte jetzt. Aber warum ist das Speicherleck für mich dasselbe, nachdem ich das auch gemacht habe? Ich bekomme keine Verbesserung im Gedächtnis. – thetna

+0

Bearbeiten Sie Ihren Code, um anzuzeigen, wie Sie den Speicher "freigeben". – Blastfurnace

Antwort

5

Mit free. Sie müssen zunächst den Speicher freimachen, auf den die Einträge arr[i] zeigen, und dann den Speicher freigeben, auf den arr zeigt (der diese Einträge enthält). Sie können es nicht anders herum tun, weil das Freigeben von Speicher bedeutet, dass Sie die Werte, die in diesem Speicher waren, nicht mehr verwenden können.

So:

for (i = 0; i < n; ++i) { 
    free(arr[i]); 
} 
free(arr); 
+0

Ich habe versucht mit dem wie es hier erwähnt wird, aber ein Fehler bekommen. Ich habe es selbst in Frage gestellt. Kannst du mir bitte sagen, was schief gelaufen ist? – thetna

1
for (i=0; i<n; ++i){ 
    free(arr[i]); 
} 

free(arr); 

Btw, sollten Sie sicherstellen, dass Ihre Zuweisungen versäumte nicht, zumindest die eine für arr, sonst würden Sie NULL-Zeiger am Ende dereferencing.

1

Sie müssen durch arr und frei arr[i] durchlaufen, und dann frei arr, wenn Sie fertig sind. Sie benötigen dieselbe Anzahl an kostenlosen Anrufen wie malloc-Anrufe.

Verwandte Themen