JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=15bb60677dd4738ff902e70e28a58fd4Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Fragen zu Speicherleaks.

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Clythoss
Junior JLI'ler


Alter: 43
Anmeldedatum: 04.05.2005
Beiträge: 64
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 09.04.2006, 08:23    Titel: Fragen zu Speicherleaks. Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
philipp_boeing
JLI'ler


Alter: 33
Anmeldedatum: 26.07.2003
Beiträge: 188

Medaillen: Keine

BeitragVerfasst am: 09.04.2006, 08:31    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Fallen
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 09.04.2006, 13:48    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Clythoss
Junior JLI'ler


Alter: 43
Anmeldedatum: 04.05.2005
Beiträge: 64
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 09.04.2006, 19:51    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
abc_d
JLI Master Trainee


Alter: 34
Anmeldedatum: 27.01.2003
Beiträge: 615

Medaillen: Keine

BeitragVerfasst am: 09.04.2006, 20:00    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Fallen
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 09.04.2006, 20:02    Titel: Antworten mit Zitat

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 Wink

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
AFE-GmdG
JLI MVP
JLI MVP


Alter: 44
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 09.04.2006, 20:32    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Loigie
Junior JLI'ler



Anmeldedatum: 29.06.2004
Beiträge: 52
Wohnort: NRW
Medaillen: Keine

BeitragVerfasst am: 12.04.2006, 17:40    Titel: Antworten mit Zitat

Wie finde ich eigentlich Speicherleaks in meinem Code wenn ich so eine Ausgabe habe Question

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. Confused
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
FH
Super JLI'ler


Alter: 36
Anmeldedatum: 16.10.2004
Beiträge: 437

Medaillen: Keine

BeitragVerfasst am: 12.04.2006, 19:39    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Jonathan_Klein
Living Legend


Alter: 36
Anmeldedatum: 17.02.2003
Beiträge: 3431
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 12.04.2006, 20:43    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
FH
Super JLI'ler


Alter: 36
Anmeldedatum: 16.10.2004
Beiträge: 437

Medaillen: Keine

BeitragVerfasst am: 13.04.2006, 00:32    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Jonathan_Klein
Living Legend


Alter: 36
Anmeldedatum: 17.02.2003
Beiträge: 3431
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 13.04.2006, 09:01    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Christian Rousselle
Site Admin


Alter: 47
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 13.04.2006, 11:10    Titel: Antworten mit Zitat

Warum sollte man so etwas kompliziertes machen? Der Debugger hilft dabei. Einfach das Programm mit F10 Starten, bei Watch _crtBreakAlloc eingeben und die Zeilennummer als Wert. Dann das Programm mit F5 laufen lassen und der Debugger hält an der Stelle an, an der der Speicher reserviert wurde. Details hier:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vsdebug/html/vxconsettingbreakpointonmemoryallocationnumber.asp
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
proggaholic
Junior JLI'ler


Alter: 35
Anmeldedatum: 07.05.2005
Beiträge: 85
Wohnort: Heap
Medaillen: Keine

BeitragVerfasst am: 03.05.2006, 21:34    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden MSN Messenger
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
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

Impressum