malloc und free



  • Hallo Community,

    ich hab ein Programm geschrieben, was Speicher allokiert und wieder freigibt. Allerdings sagt mir der Windows Task Manager, dass der Speicherverbrauch konstant ansteigt und nicht mehr sinkt.

    Dazu habe ich einen Testcode geschrieben, der mein Problem abstrahiert und exemplarisch einfach mal ein Array von Strings allokieren soll.

    #define _CRTDBG_MAP_ALLOC
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <crtdbg.h>
    
    #define ELEMENTS 1000
    
    int main()
    {
        char **feld;
    	int	 a = 0;
    
    	feld = (char **) malloc (sizeof (char *) * ELEMENTS);
    
    	for (a=0; a<ELEMENTS; a++)
    	{
    		feld[ a] = (char*) malloc (sizeof (char)*1000);
    		strcpy (feld[ a], "");
    	}
    	// MARK 1
    
    	for (a=0; a<100; a++)
    		free (feld[ a]);
    
    	free (feld);
    
    	// MARK 2
    	_CrtDumpMemoryLeaks();
        return 0;
    }
    

    Der Speicherverbrauch beträgt bei MARK 1 genau 1.892 K. Bei MARK 2 beträgt er komischerweise ebenfalls noch 1.892 K.

    Also mach ich mit dem free wohl was verkehrt. Der MemoryDump bringt mir seltsamerweise 900 Memory Leaks (sollten es nicht wenn schon denn schon 1000 sein?).

    Kann mir vielleicht jemand einen Tipp geben, wo das Problem liegt?

    Vielen Dank.

    PS: Aufgrund der Fehlinterpretation des Forums hab ich mal statt

    Feld[a]
    

    das geschrieben:

    Feld[ a]
    


  • Ronny2 schrieb:

    [...]

    #define ELEMENTS 1000

    [...]

    for (a=0; a<ELEMENTS; a++)
    {
    feld[ a] = (char*) malloc (sizeof (char)*1000);
    strcpy (feld[ a], "");
    }
    // MARK 1

    for (a=0; a<100; a++)

    [...]

    [/cpp]

    Sollte es hier nicht heißen:

    for (a=0; a<ELEMENTS; a++)

    ?



  • for (a=0; a<100; a++)
            free (feld[ a]);
    

    solltest du hier statt 100 nicht 1000 (ELEMENTS) löschen;)



  • Du hast recht... typischer "Ich seh den Wald vor lauter Bäumen nicht mehr"-Fehler.

    Ok, danke. 🙂



  • Vielleicht auch nochmal das durchlesen: http://www.c-plusplus.net/forum/viewtopic.php?t=206606



  • Danke für den Link.

    Kannst du dort noch folgenden Link bei den Tools einfügen?

    Ich hab mich letztlich für die Variante von MS entschieden, da es für mich in Zusammenarbeit mit dem Visual Studio am einfachsten damit möglich war Speicherlecks zu entdecken.

    http://msdn.microsoft.com/en-us/library/x98tx3cf(VS.80).aspx

    mfg



  • Ronny2 schrieb:

    Kannst du dort noch folgenden Link bei den Tools einfügen?

    Kann ich leider nicht. Müsste ein Moderator machen.



  • Nachtrag: Wenn ich den untypisierten malloc-Aufruf probiere, wie in dem Guide beschrieben, bringt mir VS folgende Fehlermeldung:

    error C2440: '=' : cannot convert from 'void *' to 'dbObject *'



  • Das passiert, wenn du deinen Code als C++ übersetzt.


Anmelden zum Antworten