|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Clythoss Junior JLI'ler
Alter: 44 Anmeldedatum: 04.05.2005 Beiträge: 64 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 09.04.2006, 08:23 Titel: Fragen zu Speicherleaks. |
|
|
Ich hab ne theoretische Frage zu Speicherleaks. Die Entstehung von Speicherleaks ist mir im grunde klar, Die Auswirkungen aber nicht.Ich weiß das wenn ein Programm etwa in seiner Mainloop immer wieder eine Funktion aufuft die Speicher reserviert, aber nicht wieder freigibt, es den Speicher systematisch auffrisst. Ich würde gern wissen was passiert Wenn ich ein soches Programm beende. Ist der Speicher dauerhaft blockiert(bis zum nächsten Neustart natürlich)? Oder Verschwinden alle Reservierung des jeweiligen Programms mit seiner Beendigung automatisch? Verhalten sich alle Systeme in dieser Sache gleich? _________________ Derzeitiges Projekt : Wing Fusion
Status: Es geht vorwärts...
-------------------------------------------------------
E=MC²+1W6 |
|
Nach oben |
|
|
philipp_boeing JLI'ler
Alter: 34 Anmeldedatum: 26.07.2003 Beiträge: 188
Medaillen: Keine
|
Verfasst am: 09.04.2006, 08:31 Titel: |
|
|
also meines wissens wird der speicher nach beendigung des programmes, spätestens nach dem herunterfahren wieder freigegeben. aber es ist natürlich gerade für systemlastige programme wichtig speicherlecks nicht zu verursachen, um das system nicht auszubremsen. |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 09.04.2006, 13:48 Titel: |
|
|
permanente Speicherlecks zu erzeugen ist es selber hinzubekommen relativ schwer und man wird im normalfall nur selten gelegenheit haben dieses phänomen zu beobachten reguläre Speicherlecks wie sie häufig auftreten, werden beim beenden des Prozesses wieder frei gegeben (im Sinne von: "Speicher x ist wieder reservierbar."
Man sollte allerdings um den guten Stil zu wahren alles wieder frei geben.
COM Objekte, können die permanente Speicherlecks auslösen? Glaube schon oder? _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
Clythoss Junior JLI'ler
Alter: 44 Anmeldedatum: 04.05.2005 Beiträge: 64 Wohnort: Berlin Medaillen: Keine
|
Verfasst am: 09.04.2006, 19:51 Titel: |
|
|
Der gute Stil... das wär nämlich meine 2. Frage gewesen. Warum wenn der Speicher sowieso automatisch wieder freigegeben wird alle sagen das es so enorm wichtig ist das man vor dem Beenden alles wieder freigibt. _________________ Derzeitiges Projekt : Wing Fusion
Status: Es geht vorwärts...
-------------------------------------------------------
E=MC²+1W6 |
|
Nach oben |
|
|
abc_d JLI Master Trainee
Alter: 34 Anmeldedatum: 27.01.2003 Beiträge: 615
Medaillen: Keine
|
Verfasst am: 09.04.2006, 20:00 Titel: |
|
|
Weil es zum guten Stiel gehört, ich möchte nicht das Programme mein System verlangsamen, nur weil die Programmierer zu faul wahren was freizugeben. Vor allem nicht bei Serveranwendungen.
Ausserdem sind Memory Leaks oft Sicherheitslücken, daran kann sich der PC zum Beispiel totrechnen. _________________ http://mitglied.lycos.de/sarti/linuxisevil.gif Linux is evil - get the fact.
Never touch a running System - der Systemling
Zuletzt bearbeitet von abc_d am 09.04.2006, 20:04, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 09.04.2006, 20:02 Titel: |
|
|
Halt wegen der eventuellen Unvorhersehbarkeit, kann ja zB sein das du COM Objekte benutzt (bei denen ich glaube das sie permanenten Speicher belegen könnten) oder in dem Fall in dem dein Programm irgendwo eingebettet läuft (ok auf diesen Fall brauchst du nicht acht geben).
Ausserdem hast du wenn du alles wieder frei gibst das wissen darüber was genau du freigibst, was du dann in diversen log sachen gebrauchen kannst.
Du kannst natürlich auch mit Smartpointern arbeiten, da kann dir das auch egal sein
Edit: BLD: ich glaube ihn geht es hauptsächlich um das Freigeben wenn das programm beendet wird, der Code der dort eingespeist wird sollte demnach ungefährlich sein da er ja nicht mehr ausgeführt wird. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 09.04.2006, 20:32 Titel: |
|
|
Warum freigeben vor dem beenden?
Ganz einfach: Wenn das Programm eventuell mehrere Stunden, Tage oder gar Monate am Stück laufen soll, sind schon kleine Bytegroße Speicherlecks ein großes Problem - während der Laufzeit des Programmes muss immer mehr Speicher ausgeagert werden, um die Nachfrage noch zu erfüllen und damit wird das ganze System immer langsamer, bis nichts mehr geht. _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
|
Loigie Junior JLI'ler
Anmeldedatum: 29.06.2004 Beiträge: 52 Wohnort: NRW Medaillen: Keine
|
Verfasst am: 12.04.2006, 17:40 Titel: |
|
|
Wie finde ich eigentlich Speicherleaks in meinem Code wenn ich so eine Ausgabe habe
Code: | Detected memory leaks!
Dumping objects ->
{9405} normal block at 0x09A126E0, 12 bytes long.
Data: < % > F0 0F B7 00 E0 AF A0 09 80 25 A1 09
{9403} normal block at 0x09A12698, 8 bytes long.
Data: < > 03 03 03 03 03 03 03 03
{9402} normal block at 0x09A12638, 32 bytes long.
Data: < Z_ > F8 5A 5F 00 01 00 00 00 80 DE 14 00 00 00 00 00
{9400} normal block at 0x09A12580, 124 bytes long.
Data: < _ @ # 8& > F0 16 5F 00 40 0E 23 00 80 DE 14 00 38 26 A1 09
{9337} normal block at 0x09A0AFE0, 12 bytes long.
Data: < & h$ > E0 26 A1 09 F0 0F B7 00 68 24 A1 09
{9335} normal block at 0x09A0AF98, 8 bytes long.
Data: < > 03 03 03 03 03 03 03 03
{9334} normal block at 0x09A12520, 32 bytes long.
Data: < Z_ > F8 5A 5F 00 01 00 00 00 80 DE 14 00 00 00 00 00
{9332} normal block at 0x09A12468, 124 bytes long.
Data: < _ @ # % > F0 16 5F 00 40 0E 23 00 80 DE 14 00 20 25 A1 09
{8938} normal block at 0x09A0AB50, 12 bytes long.
Data: <8 8 > 38 10 B7 00 38 10 B7 00 10 A2 A0 09
{8937} normal block at 0x09A12F58, 8 bytes long.
Data: < _ _ > CC 12 5F 00 FC 12 5F 00
{8933} normal block at 0x09A12028, 1024 bytes long.
Data: < > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
{8932} normal block at 0x09A0AA20, 32 bytes long.
Data: < Z_ > F8 5A 5F 00 01 00 00 00 80 DE 14 00 00 00 00 00
{8930} normal block at 0x09A0A210, 124 bytes long.
Data: < _ > F0 16 5F 00 A0 FB B9 0B 80 DE 14 00 20 AA A0 09
{2522} normal block at 0x09A0AD80, 48 bytes long.
Data: <Media/Enemy Spac> 4D 65 64 69 61 2F 45 6E 65 6D 79 20 53 70 61 63
{2521} normal block at 0x09A0AD10, 48 bytes long.
Data: <0 p > 30 AC A0 09 70 A4 A0 09 A0 A3 A0 09 CD CD CD CD
{2484} normal block at 0x09A0ACA0, 48 bytes long.
Data: <Media/Enemy Spac> 4D 65 64 69 61 2F 45 6E 65 6D 79 20 53 70 61 63
{2483} normal block at 0x09A0AC30, 48 bytes long.
Data: < > A8 11 B7 00 10 AD A0 09 A8 11 B7 00 CD CD CD
u.s.w. |
Ist schon erschreckend was sich da so alles an Fehlern über die Zeit einschleichen kann ohne das man es bemerkt. Mein PC führt die EXE zumindestens ohne Probleme aus. |
|
Nach oben |
|
|
FH Super JLI'ler
Alter: 36 Anmeldedatum: 16.10.2004 Beiträge: 438
Medaillen: Keine
|
Verfasst am: 12.04.2006, 19:39 Titel: |
|
|
Das sieht nicht so aus, als ob man sie aus dem Log finden könnte.
Deshalb empfehle ich Memory-Manager. Jedes bisschen an Speicher, dass du reservierst, wird über diesen Manager gemacht. Wenn am Ende noch etwas nicht freigegeben wurde, tut der Manager das, und gleichzeitig spuckt er ne Warnung aus, in der steht, wo der Speicher allokiert wurde. Schon hast du raus, welchen Speicher du noch nicht freiegegeben hast.
Gruß
FH _________________ goto work, send your kids to school
follow fashion, act normal
walk on the pavement, watch T.V.
save for your old age, obey the law
Repeat after me: I am free |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 12.04.2006, 20:43 Titel: |
|
|
kann man nicht sogar "new" und "delete" überladen? Oder geht das nur für Benutzerdefinierte Typen?
Weil da könnte man sich ja die Adressen mitsam Codestelle speichern, und aus der Liste, die du da ja shcon hast, findest du dann direkt raus, was nicht freigegeben wurde. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
FH Super JLI'ler
Alter: 36 Anmeldedatum: 16.10.2004 Beiträge: 438
Medaillen: Keine
|
Verfasst am: 13.04.2006, 00:32 Titel: |
|
|
AFAIK ja. Ich glaube, Win tut das schon, da die zu faul waren, new und delete anders zu implenetieren (zumindest im VC++ 6).
Das wäre natürlich ne gute Lösung. Allerdings: Du solltest zusehen, dass du für jeden allokierten Speicherbereich die Zeile und die Datei mitspeicherst, damit du später im LogFile ausgeben kannst, wo ein Speicherbereich nicht richtig freigegeben wurde. Das ist mit Operatoren-Überladung nnicht so ohne weiteres möglich.
Gruß
FH _________________ goto work, send your kids to school
follow fashion, act normal
walk on the pavement, watch T.V.
save for your old age, obey the law
Repeat after me: I am free |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 13.04.2006, 09:01 Titel: |
|
|
dann schreibt man sich halt ein Marko, da muss man noch nicht mal new überladen:
CPP: | #define NEW(size) new size; Log(__FILE__); LOG(__LINE__);
|
Irgendwie sowas in der Art, __FILE__ __LINE__ und __FUNCTION__ sind für sowas ja sehr praktisch. (wahrscheinlich funktioniert das Makro so net, aber theoretisch müste es so in der Art gehen). _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
|
Nach oben |
|
|
proggaholic Junior JLI'ler
Alter: 36 Anmeldedatum: 07.05.2005 Beiträge: 85 Wohnort: Heap Medaillen: Keine
|
Verfasst am: 03.05.2006, 21:34 Titel: |
|
|
Also wir haben mal aus Langeweile mehrere Experimente mit memory leaks gemacht (leider standen uns nur eine begrenzte Zahl an Rechnern mit unterschiedlichen Betriebssystemen darauf zur Verfügung) und haben festgestellt, dass der Speicher von neueren Windows-Versionen (naa, Win95 und so nicht getestet, Win98 schon, aber schon länger her) automatisch freigegeben wird.
Das ist aber noch lange kein Grund, auf free() bzw. delete zu verzichten! Denn diverse DOS-Versionen übernehmen solche Aufräumarbeiten nicht, und auf solchen Systemen ist Speicher naturgemäß rar. Ich benutze noch aktiv MS-DOS, Caldera DR-DOS und manchmal FreeDOS/OpenDOS, dort bekommt man durch memory leaks ernsthafte Schwierigkeiten. Embedded Systems dürften davon ebenfalls nicht sehr angetan sein. Datenbankprogramme, Serverprogramme, Videobearbeitung, alle Programme in die Richtung mit regem Datenverkehr können sich keine leaks leisten und sind dringend darauf angeweisen, dass auch kein anderes Programm welche reinhaut. Also bitte verwendet viel Sorgfalt darauf, und wenns nur zu dem Zweck ist, seine Programme speichersparend und leaksicher nennen zu können.
mfg
proggaholic, der sein DOS nicht in die Knie zwingen will ;) |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|