2013-06-10 7 views
5

Ich habe Speicherverluste in einem größeren Programm und ich glaube, das ist die Ursache dafür.Char Zeiger ist Struct Array Speicherleck

#include <stdlib.h> 
#include <Windows.h> 

typedef struct _struct{ 
    char* name; 
} str; 

int main() { 
    system("PAUSE"); 

    str* Character = (str*)malloc(sizeof(str) * 20000); 

    for(int i = 0; i < 20000; i++){ 
     Character[i].name = (char*)malloc(20000); // Assign memory. 
    } 

    for(int i = 0; i < 20000; i++){ 
     free(Character[i].name);   // Free memory. 
    } 

    free(Character); 
    system("PAUSE"); 
} 

Speicher bei der ersten Pause: ~ 500K.

Speicher in der zweiten Pause: ~ 1.7M.

Verwendung von VS2012 zum Testen. Irgendwelche Ideen?

+1

Ihr Code sieht korrekt aus. Wie messen Sie den Speicherverbrauch? Ist es möglich, dass Ihr Heap-Manager seinen Heapspeicher nach dem Aufruf von "free" nicht komprimiert hat? In diesem Fall wird Ihrem Prozess zusätzlicher Speicher zugewiesen, der jedoch nicht von Ihrem Programm verwendet wird, sodass er tatsächlich für anderen zuzuweisenden Code verfügbar wäre. – simonc

+0

Wenn Sie malloc verwenden, müssen Sie sicherstellen, dass der Speicher tatsächlich zugewiesen ist. If (Character == NULL) – hazzelnuttie

+0

Sie sollten die Rückgabe nicht von malloc übertragen. Dies ist C und Sie können eine void * zu etwas zuweisen. –

Antwort

4

Wie messen Sie die Speicherkapazität des Programms? Eine Sache über meinem Kopf ist, dass Sie auf die Größe des Arbeitssatzes schauen, den das OS verfolgt. Da Sie viel Speicher zugewiesen und freigegeben haben, hat sich die Größe dieses Satzes erhöht. Einige Betriebssysteme passen die Größe des Arbeitssatzes nach einiger Zeit an, andere nicht. Welches OS betrachten wir hier?

+0

Windows 7 Ultimate und Speichernutzung von Task-Manager – Marc

+0

Ich bin nicht sicher, was genau Windows (wird später überprüfen, oder jemand anderes ausfüllen kann), aber es zeigt wahrscheinlich nicht, was Sie erwarten. Moderne Betriebssysteme verwalten den Arbeitsspeicher grob und faul, um bei der Verarbeitung zu sparen, und können die Freigabe von Seiten verzögern. Die Implementierung von malloc und free könnte auch Speicher reservieren. Wenn Sie wirklich sicher sein wollen, verwenden Sie ein Tool wie Valgrind, um nach Lecks zu suchen. – idoby

+0

Ich habe es gerade mit DrMemory ausgeführt und es hat 3 (1536 Bytes) mögliche Lecks mit 319 noch erreichbaren Zuordnungen gefunden. – Marc

3

Wenn Sie malloc aufrufen, wird Speicher auf dem Heap zugeordnet. Wenn auf dem Heap nicht genügend Speicherplatz vorhanden ist, fordert das Programm das Betriebssystem auf, mehr Speicher zu belegen, und ein weiterer Chunk wird erworben. Vom Betriebssystem erworbener Speicher wird normalerweise nicht zurückgegeben, bis das Programm beendet ist (obwohl dies dem Betriebssystem obliegt).

Die Programmgröße allein kann normalerweise nicht zur Überprüfung auf Speicherlecks verwendet werden! Verwenden Sie Valgrind oder ein ähnliches Tool, um nach Speicher zu suchen, der nie free d.

-1

str * Zeichen = (str *) malloc (sizeof (str) * 20000);

In der obigen Zeile ordnen Sie den Speicher zu, indem Sie die Größe der Struktur finden. Hier ist die Größe der Struktur, die Sie erhalten, die Größe der Zeigerbreite und nicht die Größe des Zeichens.

angenommen, zum Beispiel, wenn die Zeigerbreite 32 Bit ist, wird es (4 * 20000) = 80000 Bytes zuweisen.

Wenn Sie möchten, für 20000 Struktur der, zuzuteilen

str * Character = (str *) malloc (sizeof (char) * 20000);

+1

str * Character ist ein Array von Strukturen, nicht Zeichen (verwirrenden Namen kann ich zustimmen) also sizeof (str) ist richtig –