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.
E-Mail-Adressen wurden anonymisiert, Passwort-Hashes wurden durch zufällige Werte ersetzt.
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

Luca

Treue Seele

  • »Luca« ist der Autor dieses Themas

Beiträge: 188

Wohnort: Braunschweig

  • Private Nachricht senden

1

29.09.2011, 16:56

Was genau sind Speicherleaks?

Halli Hallo,
Es wird sehr oft in meinem jetzigen und auch im letztem Buch das Wort Speicherleaks genannt. Sie entstehen, wenn ich verwendeten Speicher nicht mehr freigebe. Aber was genau ist das eigentlich? ?(

idontknow

unregistriert

2

29.09.2011, 17:06

C-/C++-Quelltext

1
2
3
int* intPointer = new int;
intPointer = 0;
// -> kein Zugriff mehr auf den Speicher auf den intPointer zuvor gezeigt hat, aber der Speicher ist immernoch da nur noch reserviert, kann also trotzdem nicht mehr genutzt werden!

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

3

29.09.2011, 17:12

Das ist so als würdest du ein Handtuch auf ne Liege am Pool legen und vergessen wo die Liege ist. Dann kann sich den ganzen Tag keiner mehr auf die Liege legen. Wenn du das sehr oft an einem Tag machst gibt es immer weniger freie Liegen. :D
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

4

29.09.2011, 17:13

http://de.wikipedia.org/wiki/Speicherleck
Da findest du noch etwas mehr dazu.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Databyte

Alter Hase

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

5

29.09.2011, 17:55

Das ist so als würdest du ein Handtuch auf ne Liege am Pool legen und vergessen wo die Liege ist. Dann kann sich den ganzen Tag keiner mehr auf die Liege legen. Wenn du das sehr oft an einem Tag machst gibt es immer weniger freie Liegen. :D


Sehr gute Erklärung ! ;) Und um das zu verhindern gibt es einen ganz besonderen Typ von Urlauber: der Müllsammler. er geht herrum und sammelt solche handtücher auf und wirft sie in den Pool. ;)
Hoffentlich weiß er auch, welche Handtücher wirklich nicht mehr benutzt werden ;)

Fireball

Alter Hase

Beiträge: 415

Wohnort: Werne

Beruf: Dipl. Inf.

  • Private Nachricht senden

6

11.10.2011, 14:44

C-/C++-Quelltext

1
2
3
int* intPointer = new int;
intPointer = 0;
// -> kein Zugriff mehr auf den Speicher auf den intPointer zuvor gezeigt hat, aber der Speicher ist immernoch da nur noch reserviert, kann also trotzdem nicht mehr genutzt werden!



kann man sich nicht einfach das

C-/C++-Quelltext

1
intPointer = 0;
sparen?

Wenn mein Programm eine Exception wirft, bevor ich delete gesagt habe, dann sollte ich den selben Effekt erzielen.

Am besten kein new Operator benutzen und wenn doch dann auto_ptr* nutzen oder eine Wrapperklasse drum bauen.


*auto_ptr geht nicht mit vector!

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

7

11.10.2011, 15:05

Du verstehst da etwas falsch. Das Beispiel soll ein Speicherleck heraufbeschwören. Es wird mit new Speicher für ien int geholt. Dann wird die Adresse von intPointer einfach auf 0 gesetzt. Das bedeutet es zeigt keine Variable mehr auf den vorher geholten Speicher. Der Speicher ist also reserviert aber kann nicht mehr freigegeben werden. Natürlich gibt es noch andere Wege dahin zu kommen;) Wenn dein Programm eine Exception wirft und du den Speicher dann nicht freigibst, dann kommt es so natürlich auch zum Speicherleck. Klar kann man sowas verhindern indem man smart pointer benutzt. Dafür gibt es die ja.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

8

16.10.2011, 22:53

Wobei auch der Smartpointer eine Schwäche hat: Objekte die sich gegenseitig referenzieren halten sich immer im Speicher, auch wenn man nicht mehr wirklich dran kann. Aber solange man darauf achtet, dass sich keine Objekte per Smartpointer gegenseitig referenzieren, ist der Smartpointer schon gut.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

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

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

16.10.2011, 23:52

Zuersteinmal hängt es von der Art von Smartpointer ab, ob so eine Konstellation überhaupt zustandekommen kann. Mit einem unique_ptr ist es z.B. schon rein aus Prinzip unmöglich sowas zu basteln. Und wenn man, z.B. mit einem shared_ptr, tatsächlich so eine Konstellation geschaffen hat, dann hat man sehr wahrscheinlich irgendwo einen grundlegenden Fehler im Design. Denn normalerweise sollte wohl eines der beiden Objekte höchstens eine Weak-Reference haben und keinen Smartpointer.

Meiner Erfahrung nach braucht man shared Ownership aber überhaut nur äußerst selten. Ich persönlich sehe shared Ownership jedenfalls als mögliches Symptom eines nicht ganz durchdachten Designs, denn imo zeigt ein shared_ptr mir an, dass der Scope der betroffenen Objekte irgendwie nicht so ganz klar ist.

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »dot« (17.10.2011, 00:03)


Werbeanzeige