Warum sind Speicherverluste häufig?

8

Liegt es an grundlegenden Missverständnissen, wie der Speicher dem Programmierer dynamisch zugewiesen und freigegeben wird? Liegt es an Selbstzufriedenheit?

    
Brandon 27.01.2010, 03:27
quelle

5 Antworten

15

Nein. Es liegt an der schieren Menge an Buchhaltung, die es braucht, um jede Speicherzuweisung im Auge zu behalten. Wer ist verantwortlich für die Zuweisung des Speichers? Wer ist dafür verantwortlich, es zu befreien? Stellen Sie sicher, dass Sie die gleiche API verwenden, um den Speicher zuzuordnen und freizugeben, usw. Stellen Sie sicher, dass Sie jeden möglichen Programmfluss erfassen und in jeder Situation bereinigen (z. B. sicherstellen, dass Sie bereinigen, nachdem Sie einen Fehler oder eine Ausnahme festgestellt haben). Die Liste geht weiter ...

    
Jesse Weigert 27.01.2010, 03:33
quelle
3

In einem anständigen Projekt kann man den Überblick über zugewiesene Ressourcen verlieren.

Manchmal wird eine Funktion geschrieben, die eine nicht initialisierte Datenstruktur als Eingabe erwartet, die dann initialisiert wird. Jemand übergibt eine Datenstruktur, die bereits initialisiert wurde, und somit ist der zuvor zugewiesene Speicher durchgesickert.

Speicherlecks werden durch grundlegende Missverständnisse verursacht, die der gleiche Sinn jeder Bug ist. Und ich wäre schockiert herauszufinden, dass jemand jedes Mal zum ersten Mal einen fehlerfreien Code schreibt. Speicherlecks sind zufällig die Art von Bug, der selten einen Absturz oder ein explizit falsches Verhalten verursacht (außer natürlich zu viel Speicher zu verwenden), so dass Speicherentwickler wahrscheinlich nie wissen werden, dass sie vorhanden sind, es sei denn, Speicherlecks werden explizit getestet. Angesichts der Tatsache, dass Änderungen in der Codebase immer Fehler hinzufügen und Speicherverluste praktisch unsichtbar sind, werden Speicherlecks größer, wenn ein Programm älter wird und sich vergrößert.

Auch in Sprachen mit automatischer Speicherverwaltung kann aufgrund von zyklischen Verweisen Speicher verloren gehen, abhängig vom verwendeten Garbage Collection-Algorithmus.

    
Justin Smith 27.01.2010 03:40
quelle
2

Ich denke, es liegt an dem Druck, im Job zu arbeiten, der die Fristen und das obere Management erfordert, um das Projekt voranzutreiben. Man könnte sich also vorstellen, dass in solchen unter Druck stehenden Umgebungen durch das Testen von q & amp; a, Peer-Code-Überprüfungen Speicherlecks durch das Netz rutschen könnten.

Da Ihre Frage Sprache nicht erwähnt hat, gibt es heute eine automatische Speicherverwaltung, die sich um die Speicherabrechnung kümmert, um sicherzustellen, dass keine Speicherlecks auftreten, denken Sie an Java / .NET, aber einige können durch das Netz schlüpfen. Es wäre mit Leuten wie C / C ++ gewesen, die die malloc / new -Funktionen verwendet haben und aufgrund der schieren Speichermenge, die zugewiesen wird, immer schwieriger zu überprüfen sind.

Andererseits kann es schwierig sein, diese Lecks aufzuspüren, was dieser Antwort einen weiteren Kringel hinzufügt - ist es so, dass es auf der Maschine des Entwicklers nicht auftaucht, aber in der Produktion beginnt der Speicher zu lecken wie die Hölle, ist es die Konfiguration, Hardware, Software-Konfiguration, oder noch schlimmer, das Speicherleck kann in zufälliger Situation auftreten, die innerhalb der Produktionsumgebung einzigartig ist, oder ist es die Zeit / Kosten-Einschränkung, die die Speicherlecks auftreten oder ist es ist, dass die Speicher-Profiling-Tools Kosten unerschwinglich oder Mangel an Finanzierung sind, um das Entwickler-Team zu helfen, Lecks aufzuspüren ...

Alles in allem hat jeder einzelne innerhalb des Entwicklerteams die Verantwortung dafür, dass der Code funktioniert, und kennen die Regeln zur Speicherverwaltung (z. B. wie für jedes malloc sollte es ein free geben, für jedes new sollte es ein delete geben, aber keine Schuld sollte dem Entwicklerteam selbst zugeordnet werden, auch nicht Fingerzeig auf das Management, um sich entweder auf den Druck auf das Entwicklerteam zu stürzen.

Am Ende des Tages wäre es eine falsche Wirtschaft, sich nur auf das Entwicklerteam zu verlassen und "Selbstgefälligkeit" auf ihre Schultern zu legen.

Hoffe, das hilft, Freundliche Grüße, Tom.

    
t0mm13b 27.01.2010 03:46
quelle
1
  1. Bugs.

  2. Auch ohne Fehler kann es unmöglich sein, im Voraus zu wissen, welche Funktion den Speicher freigeben soll. Es ist einfach genug, wenn die Codestruktur im Wesentlichen funktional ist (die Hauptfunktion ruft Unterfunktionen auf, die Daten verarbeiten und dann ein Ergebnis zurückgeben), aber es ist nicht trivial, wenn mehrere Stufen (oder mehrere verschiedene Objekte) ein Stück Speicher teilen. Intelligente Zeiger können verwendet werden (in C ++), aber ansonsten ist es mehr oder weniger unmöglich.

  3. Lecks sind nicht die schlimmste Art von Bug. Ihr Effekt ist im Allgemeinen nur eine kumulative Verschlechterung der Leistung (bis Sie nicht mehr genügend Speicher haben), so dass sie nicht so hohe Priorität haben.

wisty 27.01.2010 04:50
quelle
1

Mangel an strukturierten Bereichen und eindeutiger Besitz des zugewiesenen Speichers.

    
kyoryu 27.01.2010 07:21
quelle

Tags und Links