Memory Leak und Strukturen?!?



  • Also, wenn ich debugge, dann schaue ich unter Debug->Windows->Memory mir an, was nach dem delete passiert. Da habe ich dann gesehen, dass sich auch die Bytes drumherum alle ändern. Das scheint aber wohl normal zu sein.

    Beim Taskmanager schaue ich parallel nach, wieviel Speicher das Programm gerade benutzt. @Jochen: die Optionen, welche du beschrieben hast, finde ich aber nicht beim Task Manager?!? EDIT: Hab's gefunden. 🙂

    @net: Das ist es ja. Visual Studion meckert nicht.

    MfG,
    Paul.

    EDIT2: Ok, VM-Size wächst definitiv.



  • Paul_C. schrieb:

    Ach ja, und da dieser Teil des Programms nicht in C++ geschrieben werden darf, darf ich keine Klassen nutzen. 😞

    wenn es kein C++ sein darf, fällt auch new/delete aus...

    ohne genügend quellcode kannst hier genausogut volkards glaskugel fragen.



  • Paul_C. schrieb:

    Ach ja, und da dieser Teil des Programms nicht in C++ geschrieben werden darf, darf ich keine Klassen nutzen. 😞

    wenn es kein C++ sein darf, fällt auch new/delete aus...

    ohne genügend quellcode kannst hier genausogut volkards glaskugel fragen.



  • Nimm einfach mal die CMemoryState Klasse, die sagt dir genau wieviel und in welchen Speicherheap dein leck ist.

    So in etwa hatte ich es mal implementiert:

    #if defined(_DEBUG)
    	CMemoryState diffMemState;
    
    	newMemState.Checkpoint();
    	if(diffMemState.Difference( oldMemState, newMemState )) diffMemState.DumpStatistics();
    #endif 
    }
    

    Du brauchst allerdings die atlsession.h für die Unterstützung.
    Sollte aber kein porp. sein. Ansonsten musst du halt noch andere basis atl header includieren. Da du ja keine Klassen verwenden darfst/willst kannst dus ja mal temporär einbinden um das leck zu finden und nachher wieder raus machen. 😉

    EDIT: Erklärungen yur Klasse findest du hier: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcmfc98/html/_mfc_cmemorystate_class_members.asp

    codeman



  • camper schrieb:

    Paul_C. schrieb:

    Ach ja, und da dieser Teil des Programms nicht in C++ geschrieben werden darf, darf ich keine Klassen nutzen. 😞

    wenn es kein C++ sein darf, fällt auch new/delete aus...

    ohne genügend quellcode kannst hier genausogut volkards glaskugel fragen.

    ja, im eigentlichen Programm ist das auch mit malloc() realisiert.
    Finde hier new/delete 'übersichtlicher'. (ok, bin nur schreibfaul).

    Ok, mal sehen, was ich mit der Klasse machen kann.
    Danke. Melde mich wieder. 😉



  • Wenn du keine Klassen verwenden darfst, mußt du selber dafür sorgen, daß nirgends ein Zeiger verloren geht (am besten geht das, indem deine Operatoren die verwendbaren Structs von außen bekommen):

    void mult(MyStruct l,MyStruct r,MyStruct* ret)
    {
      assert(ret!=NULL);
      ret->len=l.len+r.len;
      if(ret->num!=NULL)
        free(ret->num);
      ret->num=malloc(ret.len*sizeof(unsigned int);
      //fülle ret->num
    }
    
    MyStruct a,b,c;
    //fülle a und b
    mult(a,b,&c);
    


  • @CStoll: so ähnlich mache ich das auch. 😉

    Zur CMemoryState: Der gibt mir auch kein Memoryleak, aber der Task Manager sagt was anderes. Man kann auch erkennen, dass da auch immer wieder mal was freigegeben wird. Momentan springt der VM-Size zwischen ca. 2000 KB und 4000 KB, und wächst stetig ein wenig. 😕



  • Habe nun ca. 10 Minuten das Programm laufen lassen. Zuerst sah es so aus, als ob es sich bei ca. 4500 KB einpendeln würde. Dann nach 7 Minuten plötzlich ein Sprung auf 55000 KB! Und dort verblieb es dann.



  • Solange du am Programmende alles wieder freigegeben bekommst, ist es kein Leck 😉 Es kann höchstens sein, daß der Heap-Manager sich gleich etwas mehr Speicher reserviert als er wirklich benötigt (dafür kann er den nächsten new/malloc dann aus seinen Reserven bedienen).



  • Na gut, dann belasse ich es vorerst dabei.
    Ein großes DANKESCHÖN! 😃

    MfG,
    Paul.


Anmelden zum Antworten