Wie oft unterläuft euch ein Memleak?
-
dot schrieb:
Ich bin mittlerweile sogar fast der Meinung, dass auch new und delete in ihrer jetzigen Form nicht Teil einer Sprache sein sollten (eine Erkenntnis, die ich Krishty zu verdanken hab). Eine Sprache sollte rein nur eine Möglichkeit bieten, Objekte zu konstruieren und wieder zu zerstören. Speicher besorgen und wieder zurückgeben, sollte explizit Aufgabe einer Library sein...
Naja...
Im Prinzip macht C++ das ja auch so. Nur dass das Interface etwas unglücklich gewählt wurde. DAS finde ich schade, aber vom Prinzip her ist es mMn. schon OK.Wenn man es sich wirklich antun will, dann gibt es auch noch placement new, und als Ersatz für das fehlende placement delete darf man Destruktoren direkt aufrufen, und den Speicher danach selbst freigeben.
(Wobei es "placement delete" strenggenommen sogar gibt, wird aber nur automatisch vom Compiler aufgerufen wenn eine Exception in einem per "placement new" aufgerufenen Konstruktor fliegt.)Man kann sich also jederzeit seine eigenen "new"/"new []" sowie "delete"/"delete []" Funktionen (Templates) schreiben.
-
hustbaer schrieb:
Im Prinzip macht C++ das ja auch so. Nur dass das Interface etwas unglücklich gewählt wurde.
Ja, das Interface ist imo in der Tat sehr unglücklich gewählt...
hustbaer schrieb:
Man kann sich also jederzeit seine eigenen "new"/"new []" sowie "delete"/"delete []" Funktionen schreiben.
Theoretisch ja, in der Praxis ist das aber, aufgrund des unglücklich gewählten Interface, potentiell problematisch. Ich denk da z.B. an so Dinge, wie das Sicherstellen, dass auch überall im Programm die richtigen Versionen der Funktionen bekannt sind und verwendet werden...
-
Xin schrieb:
kellerassel schrieb:
hab grad wieder einen gefunden
Ausgesprochen selten, wobei mich das das selbst wundert.
Gelegentlich mit valgrind gegentesten.
mach ich schon, aber das langweilt mich, mysql und die c++ lib die ich verwende werfen ständig fehler und dann muss man ewig scrollen
-
axo, bei mysql schauts so aus...
==20468== Conditional jump or move depends on uninitialised value(s) ==20468== at 0x4063A2E: inflateReset2 (in /usr/lib/libz.so.1.2.3.4) ==20468== by 0x4063B0C: inflateInit2_ (in /usr/lib/libz.so.1.2.3.4) ==20468== by 0x4063B82: inflateInit_ (in /usr/lib/libz.so.1.2.3.4) ==20468== by 0x405E34E: uncompress (in /usr/lib/libz.so.1.2.3.4) ==20468== by 0x4333474: my_uncompress (in /usr/lib/libmysqlclient.so.16.0.0) ==20468== by 0x435E88E: my_net_read (in /usr/lib/libmysqlclient.so.16.0.0) ==20468== by 0x4358323: cli_safe_read (in /usr/lib/libmysqlclient.so.16.0.0) ==20468== by 0x4358AC4: ??? (in /usr/lib/libmysqlclient.so.16.0.0) ==20468== by 0x43240BB: mysql_next_result (in /usr/lib/libmysqlclient.so.16.0.0) ...
-
vllt. hab ich auch einfach was falsch gemacht
was solls es funktioniert... damit muss man auch mal zufrieden sein
-
Das hat mich irgendwie an schlechte Werbung fuer Putzmittel oder Waschmittel erinnert. Das klingt so, als koenne man nicht Wasche waschen, wenn Persil oder Spee fehlt. Klar ist die vollautomatische Waschmaschine besser als das Scheuerbrett, eine Wahl faellt dabei nicht schwer. Ja gebt mir all die netten Sachen, aber gegen das Meer aus ... schlechter Software kann ich damit wenig ausrichten. Wo kommt all der schlechte Code her?
Dann zur Sache mit dem Neuschreiben: Angenommen mir wird die Zeit gegeben, angenommen ich werde dafuer bezahlt. Angenommen ich habe eine neues funktionierendes Progr ... erstmal nur ein Programm. Angenommen es besteht auch die Tests. Was halte ich dann in den Haenden? Von aussen betrachtet hat es keinen Mehrwert, bis jetzt hat es nur Kosten verursacht, damit der Entwickler ... ruhiger schlafen kann? Vielleicht zahlt es sich in spaeteren Jahren aus, vielleicht auch nicht. Ungewiss!
Bist du ein selbstständiger C Programmierer ?
Eine Sache: Nimm mal eine Funktion und verifiziere / beweise formal dass die Funktion kein Speicherleck hat. Und dann gehe hin, programmiere diese mit RAII um und beweise das Ganze nochmal.
RAII ist doch ein Weg robusteren Code zu schreiben, da man sich Anforderung allokierten Speicher wieder freizugeben durch einen Automatismus ersetzt wird. Dann spielt es auch keine Rolle mehr, dass Benutzer explizit Experten in Speicheranforderungen sein müssen, um Funktion XYZ zu manipulieren. Es entkoppelt ein wenig den Entwickler von der Funktion, in dem die Funktion einfacher für's weiterzuentwickeln macht. Gemäß dem Motto: "Funktionen sollen einfach zu benutzen sein, aber schwer zu missbrauchen sein."
Im Embedded Bereich stößt man hier auf einen Trade-Off: Opferte man gerne ein paar Takte um sicherzustellen dass der Speicher immer intakt/konsistent bleibt ?
-
wenn ich mal meine firma mit angestellten hab, und dann einer mit: 'verwenden wir doch c++ und schreiben alles um' kommt, schmeiß ich ihn zum nächst möglichen zeitpunkt raus
-
btw. ich wollte es anfangs auch in c++ machen und ich bin so froh, das ich es nicht gemacht hab
-
@Bitte ein Bit: Ja ich verwende RAII, ja ich kenne die Vorzuege. Keine Ahnung, was du mir sagen moechtest. Ich will nur sagen: Schaut euch die reale Welt an, schaut euch reale Software an.
Eine Sache: Nimm mal eine Funktion und verifiziere / beweise formal dass die Funktion kein Speicherleck hat. Und dann gehe hin, programmiere diese mit RAII um und beweise das Ganze nochmal
Mit Disziplin bei der Implementierung geht beides gleich leicht. Das koennen sich glaube die wenigsten vorstellen. Und RAII hilft einem diszipliniert zu sein. Zu der C vs C++ Sache: Ich bin der Meinung, wer C++ kann, sollte bei C nicht total aufgeschmissen sein, wenn er etwas implementieren muss.
-
knivil schrieb:
Ich will nur sagen: Schaut euch die reale Welt an, schaut euch reale Software an.
und sowas postest du ins internet