Speicherlecks beseitigen?
-
Hi, ich hab ein kleines Problem mit einem Programm dass ich geschrieben hab, und zwar hat es einige Speicherlecks, doch leider versteh ich nur Bahnhof wenn ich sie von einem Speicherdebugger prüfen lasse. Daher wollte ich mal fragen ob es jemand gibt der sich damit auskennt und das Programm vielleicht mal durchschauen könnte. Und keine Angst es ist nichts spektakuläres, das Programm liest lediglich paar Zahlen ein sortiert sie dann. Also ich wäre sehr Dankbar wenn sich das mal wer anschauen könnte, es eilt aber
-
Wenns so wenig is, dann poste doch einfach den Code hier.
-
Es sind halt ca 160 zeilen mit kommentaren, will den code eigentlich nicht öffentlich posten, aber wenn du interesse hast kann ich ihn dir gerne per pm schicken.
-
PMs gibts hier nicht. Ich sehe folgende Möglichkeiten:
a) Du löst das Problem alleine, was du aber offensichtlich nicht kannst
b) Du postest den Code hier, was du offensichtlich nicht willst
c) Ich verschiebe dich in das Projekteforum, du hinterlässt Email und Bezahhlungsvorschläge und hoffst, dass sich jemand meldet.Your choice.
-
bei 160 Zeilen (mit Kommentaren) Code kann auch noch nicht soo viel bahnbrechendes dabei sein, dass du der Meinung sein müsstest, es zu verheimlichen..
Speicherlecks entstehen überall dort, wo du referenzen weiter gibst, löschst, erweiterst, erstellst und wo du Bufferlängen unter- bzw. überschätzt. Dein Programm ist zwar vom OS her dagegen geschützt, dass man von außen so einfach dessen Speicher überschreiben kann, aber ob du deine Speicherbereiche selbst überschreibst, ist dem OS so ziemlich Jacke.
Ha hilft eigentlich nur, rechtzeitig planen, immer definierte Zugriffswege (Funktionen) nutzen und gründlich aufräumen.
Ansonsten ist nen Debugger einiges wert..Wenn du allerdings mehr Hilfe erwartest, dann musst du entweder mal im Wahrsagerforum gegenüber fragen oder uns glauben, dass wir mit deinen 160 Zeilen (mit Kommentaren) nicht gleich zum Patentamt rennen...
-
Achso, dass es hier keine PMs gibt wusste ich nicht, dann habt ihr hier mal einen link zum code und einer Datei von der die Zahlen eingelesen werden.
Also erstmal paar Worte zu dem Programm.
Wie gesagt, das Programm liest aus einer Dateien Zeilen aus, die über die Kommandozeile angegeben wird.
Ausgelesen wird das ganze mit fgets(), und zwar zweimal, einmal nur um zu testen ob das Format in der Eingabedatei richtig ist und die Anzahl der Zahlen zu zählen und ein zweites mal um die Zahlen in einem dynamischen Array einzusortieren. Das Array wird übrigens je nach Anzahl der vorhandenen Zahlen erstellt.
Abgearbeitet werden die Zahlen Zeilenweise.Output ist einfach die Datei wie die Ausgabe zu der Beispieldatei aussehen soll.
Solltet ihr genauere Infos zum Sortier-Algorithmus oder der dem Ausgabeformat oder sonst was haben, meldet euch einfach noch mal.Achja und erwartet nichts tolles, ist mein erstes C Programm
Danke schonmal
-
oh man
Ich lies in deinem Prog nur MALLOC wo sind den die FREE's ???
Du weist schon , das du den speicehr den ndu mit malloc reserviert , auc hwieder mit free freigeben mussT!!!
void Speicher_freigeben(int lange){ for (i =0; i< laenge;i++) free(matrix[i]); free(matrix); };
-
Naja das stimmt nun auch nicht, das einzige mal wo ich malloc benutze ist um das dynamische Array zu erstellen (matrix), und das wird auch nach jedem Schleifendurchlauf, also wenn eine Zeile abgearbeitet wurde wieder freigegeben.
154: free(matrix);
Und bist du dir sicher dass ich es so freigeben muss wie du das sagst? meines Wissens nach reicht es wenn ich einfach free(matrix); schreibe.
-
n1smo schrieb:
meines Wissens nach reicht es wenn ich einfach free(matrix); schreibe.
Offensichtlich reicht es nicht. Zu jedem malloc gehört ein free.
-
Probier es, und du wird sich freuen;)
-
Oh, klappt tatsächlich^^
Super danke, jetzt bin ich von 710 bytes in 36 blocks runter auf 90 byte in einem block.Jemand noch ne Idee wo was falsch sein könnte?
Ich poste einfach mal was mir Rational Purify (mein Speicherdebugger) jetzt ausspuckt.
[I] MPK: Potential memory leak of 90 bytes from 1 block allocated in lock [MSVCRT.dll]
Offset 0x0000000d referenced by 0x01a742a0, a location in a malloc'd block
Offset 0x0000004e referenced by 0x01a742a4, a location in a malloc'd block
Offset 0x0000000d referenced by 0x01a741b8, a location in a malloc'd block
Offset 0x0000004e referenced by 0x01a741bc, a location in a malloc'd blockDistribution of potentially leaked blocks
90 bytes from 1 block of 90 bytes (0x01a741b8)Allocation location
malloc [C:\WINDOWS\system32\MSVCRT.dll]
lock [C:\WINDOWS\system32\MSVCRT.dll]
_getmainargs [C:\WINDOWS\system32\MSVCRT.dll]
??? [C:\Dev-Cpp\Uni.exe ip=0x0040114F]
??? [C:\Dev-Cpp\Uni.exe ip=0x00401238]
??? [C:\Dev-Cpp\Uni.exe ip=0x00406059]Und hier noch ne Beschreibung was mit MPK gemeint ist.
An MPK message describes heap memory that might have been leaked. There are no pointers to the start of the block, but there appear to be pointers pointing somewhere within the block. In order to free this memory, the program must subtract an offset from the pointer to the interior of the block. In general, you should consider a potential leak to be an actual leak until you can prove that it is not by identifying the code that performs this subtraction.
Memory in use can appear as a MPK if the pointer returned by some allocation function is offset. This message can also occur when you reference a substring within a large string. Another example occurs when a pointer to a C++ object is cast to the second or later base class of a multiply-inherited object and it is offset past the other base class objects.
Alternatively, leaked memory might appear as a MPK if some non-pointer integer within the program space, when interpreted as a pointer, points within an otherwise leaked block of memory. However, this condition is rare.
Inspection of the code should easily differentiate between different causes of MPK messages.
Purify generates a list of leaked memory blocks when you do any one of the following:
§ Exit the program and Memory leaks is selected in the Errors and Leaks tab in the Default Settings dialog box or Settings for exename dialog box. This is the default.
§ Call one of the Purify API functions: PurifyNewLeaks or PurifyAllLeaks.
§ Specify /LeaksAtExit=yes at the command line.
Dann hätte ich da noch was interessantes. Nicht von mir selber getestet aber von jemand anderem, unter Linux mit Valgrind.
==12084== 352 bytes in 1 blocks are still reachable in loss record 1 of 3
==12084== at 0x4020724: malloc
(in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==12084== by 0x409BEAE: (within /lib/tls/libc.so)
==12084== by 0x409BF6C: fopen (in /lib/tls/libc.so)
==12084== by 0x8048A55: main (main4.c:127)
==12084==
==12084==
==12084== 3,528 bytes in 1 blocks are possibly lost in loss record 2 of 3
==12084== at 0x4020724: malloc
(in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==12084== by 0x8048715: speicher_reservieren (main4.c:47)
==12084== by 0x8048AE0: main (main4.c:142)
==12084==
==12084==
==12084== 8,673,460 bytes in 3,126 blocks are definitely lost in loss record 3
of 3
==12084== at 0x4020724: malloc
(in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==12084== by 0x8048715: speicher_reservieren (main4.c:47)
==12084== by 0x8048AE0: main (main4.c:142)Ich hab den auszug übrigens geupdated, also die Zeilenangaben, entsprechend dem aktuellen Code, da der log noch von der vorherigen Version ist.
Auch wenn die lecks von der grösse her deutlich grösser angezeigt werden als bei mir, sollten die letzten beiden nun auch behoben sein, zumindest denke ich das. Da man ja bei beiden sieht dass es was mit dem reservieren des Speichers fürs Array zutun hatte.Das erste Problem (fopen) wird bei mir erst garnicht angezeigt.
Könnte es sei dass er da meckert, weil ich den file stream öffne, aber am ende nicht mehr schliesse?
-
Zeigt dir deine IDE auch memoryleaks an?
-
Nee, arbeite nur mit Dev-C++, das hat die funktion glaub ich nicht.
Falls jemand nen wirklich guten C IDE empfehlen kann, kann er das auch ruhig tun, muss auch keine freeware sein. Hab mich schon ne weile mit Eclipse und dem C plugin rumgeschlagen aber bin zu dämlich das zum laufen zu bringen. Und Visual C++ arbeitet irgendwie nur mit C++ gescheit.
Hab mein letzten Beitrag übrigens nochmal geupdatet.
-
Visual Studion 2005 C++ Express. da is glaub auch pure C dabei:) und ist kostenlos
-
Wie kann ich am besten Speicherlecks im VS.NET erkennen? Gibts da ein Tool für Windows oder sogar ein Plugin?