Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

11.09.2012, 18:15

Speicherleck Klasse

Hi Leute,

habe in meinem Programm ein Speicherleck festgestellt, und weiß nicht genau wie er entsteht..

C-/C++-Quelltext

1
2
class z{public: virtual ~z() {}};
class w : public z{public:  virtual ~w() {}private: double highMemoryUsage[48000];};



Wenn ich diese Schleife durchlaufen lasse, dann springt meine Auslastung an Arbeitsspeicher von ca. 1980 auf 2360kByte.
Dieser Sprung ist konstant, auch wenn ich die Arrayzahl änder oder die Anzahl an Schleifendurchgängen.


C-/C++-Quelltext

1
for(int i = 0; i < 50000; i++)  {    z* obj = new w();   delete obj;    }

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Palimaschin« (11.09.2012, 18:20)


Tobiking

1x Rätselkönig

  • Private Nachricht senden

2

11.09.2012, 18:36

Wie misst du denn die Speicherauslastung? Generell geben Anwendungen angeforderten Speicher nicht so schnell wieder zurück, weswegen es aus Sicht des Betriebssystem so aussieht, als wäre er noch belegt. Ich würde mal darauf tippen, dass es hier einfach der Fall ist.

3

11.09.2012, 18:39

Ich habe über den Task Manager drüber geschaut; aber wenn das so ist, muss ich mir in meiner richtigen Anwendung keine Gedanken machen. War nur auf den ersten Schlag so ziemlich geschockt ;)

eXpl0it3r

Treue Seele

Beiträge: 386

Wohnort: Schweiz

Beruf: Professional Software Engineer

  • Private Nachricht senden

4

12.09.2012, 03:47

Für Memory Leak Detection gibt es verschiedenste Tools, meist angepasst an die Entwicklungs Umgebung/Compiler. Für Visual Studio wird alles hier erklärt. Für GCC + Linux wird öfters mal Valgrind verwendet. Und wenn man weiss was man tut, kann man new und delete auch selbst überladen.
Bei allen Tools muss man den Output jedoch mit Vorsicht geniessen, besonders wenn externe Libraries wie z.B. OpenGL oder DirectX mitspielen, es gibt viele False-Positives. ;)
Blog: https://dev.my-gate.net/
—————————————————————————
SFML: https://www.sfml-dev.org/
Thor: http://www.bromeon.ch/libraries/thor/
SFGUI: https://github.com/TankOs/SFGUI/

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

5

12.09.2012, 08:58

Ich habe über den Task Manager drüber geschaut; aber wenn das so ist, muss ich mir in meiner richtigen Anwendung keine Gedanken machen. War nur auf den ersten Schlag so ziemlich geschockt ;)
RAM vom OS zu holen ist eine etwas aufwendige Operation, die auch recht grob ist, da das immer nur in Blöcken von mindestens 4kb geht. Deswegen holt sich die Implementierung von new/delete etwas RAM vom OS und unterteilt den selber noch mal weiter. Die Implementierung gibt RAM auch nicht sofort zurück, sonst müsste man beim nächsten new wieder neuen RAM vom OS holen.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

6

12.09.2012, 09:29

Zitat

Bei allen Tools muss man den Output jedoch mit Vorsicht geniessen, besonders wenn externe Libraries wie z.B. OpenGL oder DirectX mitspielen, es gibt viele False-Positives.
Oh ja, da stimm ich vollkommen zu. Aufgrund von DirectX habe ich ja überhaupt erst nachgeschaut, warum der Arbeitsspeicherverbrauch ansteigt.

Zitat

Die Implementierung gibt RAM auch nicht sofort zurück, sonst müsste man beim nächsten new wieder neuen RAM vom OS holen.
Gut zu wissen.

Zitat

Für Memory Leak Detection gibt es verschiedenste Tools, meist angepasst an die Entwicklungs Umgebung/Compiler. Für Visual Studio wird alles hier erklärt.
Klasse Link!

Werbeanzeige