Speicherverbrauch explodiert...
-
Servus Folks,
gibt es Tools mit dem selbst programmierte Anwendungen überprüfen werden können, wo der Speicherverbrauch explodiert ? Hab meinen Quellcode schon dreimal überarbeitet und hab zu jedem calloc ein free. Dennoch explodiert der Verbrauch... Welche Gründe könnte das noch haben ?`
Winn
-
Ja, dafür gibt es Tools. Google mal nach memory leak detection oder sowas, da wirst du ne Menge finden.
Programmierst du in C (ohne ++) ? - dann gute Nacht.
-
Optimizer schrieb:
Programmierst du in C (ohne ++) ? - dann gute Nacht.
Danke für den Tipp ! Warum gute Nacht, ist C (ohne ++) dafür derart anfällig ?
-
Nein, glaub ich jetzt nicht. Ich programmiere kein C weil es einfach zu hässlich ist. Evtl. könntest du Destruktoren für die Speicherbereinigung vermissen.
-
Valgrind ist das Tool der Wahl
@Optimizer
das ist doch nur geflame.
-
Aha.
-
noch nix von new überladung in C++ oder #define in C gehört?
Ist doch voll easy. Speicher 'selber' anfordern und in einer liste verwalten, beim freigeben aus der liste entfernen - was am ende noch in der liste ist, ist nicht freigegebener speicher. wenn man sich noch die datei und die zeile merkt in der der speicher angefordert wurde, hat man das problem schon fast gelöst.
ich finde das in c++ durchaus sehr einfach soetwas zu realisieren.
-
Gründe für Speicherexplosionen können übrigens auch ohne Memory Leaks entstehen... wenn man einen ungeschickten Algorithmus hat oder irgendwo mit der Bearbeitung von etwas nicht nachkommt. Dann läuft auch irgendeine Datenstruktur voll. Ein Memory Leak habe ich deswegen trotzdem nicht, da beim Programmende der ganze Speicher abgeräumt wird. Nur zur Laufzeit allokiert das Programm einfach zu viel und es gibt eine Art "Stau".
Dagegen kann übrigens auch keine Garbage Collection schützen, denn der Speicher ist ja noch in Benutzung.
-
Marc++us schrieb:
Gründe für Speicherexplosionen können übrigens auch ohne Memory Leaks entstehen... wenn man einen ungeschickten Algorithmus hat oder irgendwo mit der Bearbeitung von etwas nicht nachkommt. Dann läuft auch irgendeine Datenstruktur voll. Ein Memory Leak habe ich deswegen trotzdem nicht, da beim Programmende der ganze Speicher abgeräumt wird. Nur zur Laufzeit allokiert das Programm einfach zu viel und es gibt eine Art "Stau".
Dagegen kann übrigens auch keine Garbage Collection schützen, denn der Speicher ist ja noch in Benutzung.
Hmm... ich glaube das trifft eher in meinem Fall zu. Ich habe in dem Algorithmus der höchstwahrscheinlich für die Speicher Explosion zuständig ist, folgendes struct (siehe auch http://www.c-plusplus.net/forum/viewtopic.php?t=70454 )
struct { int used; int x,y,z; double value; } Summand;
Von dem Summand hab ich mehrere Tausend, die ich wie in einer symbolischen Berechnung vereinfache.
Value -> Entspricht dem Wert
x,y,z -> Entspricht einer Koordinate bzw. einen spezifischen Summand
used -> nun wie wenn man auf dem Papier rechent, streiche ich die Elemente aus der Liste, die ich schon benutzt hab. ( 0 = unbenutzt, 1 = benutzt, 2 = auf dem alles aufsummiert wird )Hier der Algorithmus:
void FullSimplify(Summand *Liste, int Quantity) { int i; int Complete; int x,y,z; int ThisOne; int SType; double val; Complete=0; ThisOne=0; SType=1; val=0.; while (Complete==0) { x=Liste[ThisOne].x; y=Liste[ThisOne].y; z=Liste[ThisOne].z; val=Liste[ThisOne].value; Liste[ThisOne].used=2; for(i=0;i<Quantity;i++) if ((Liste[i].used==0) && (Liste[i].x==x) && (Liste[i].y==y) && (Liste[i].z==z) && (i!=ThisOne)) { val+=Liste[i].value; Liste[i].value=0.; Liste[i].used=1; } Liste[ThisOne].value=val; ThisOne=FindUnused(Liste,Quantity); SType++; if (SType>Quantity) Complete=1; if (ThisOne==NotANumber) break; }; }
Seht Ihr hier vielleicht irgendein Problem, welches für meine Speicherexplosion verantwortlich wäre ?