Speicherleaks und Bugs finden Institut für Numerische Simulation, Universität Bonn findet Seminarreihe Technische Numerik
findet findet
C/C++ bieten keinen Garbage Collector. Vorteile Mehr Freiheiten. Bewussteres Programmieren. Nachteile Speicherlecks können entstehen. Na und? Speicherlecks sind kein sauberer Code! Speicherlecks in Schleifen oder Unterfunktionen potenzieren sich! findet
Ich mache direkt alles richtig. void f() { double *ptr = new double(0.); delete(ptr); Zu jedem new() gibt es auch ein delete(). Funktionen, die Speicher allokieren und diesen als Rückgabe liefern... A. gibt es bei mir nicht. B. werden niemals in... durch Exceptions oder Abbrüche unterbrochen. C. kommen niemals in Schleifen vor, damit keine delete s durch continue/goto übergangen werden. D. werden alle erkannt und der Speicher freigegeben. findet
Ich mache direkt alles richtig. void f() { double *ptr = new double(0.); delete(ptr); Zu jedem new() gibt es auch ein delete(). Funktionen, die Speicher allokieren und diesen als Rückgabe liefern... A. gibt es bei mir nicht. B. werden niemals in... durch Exceptions oder Abbrüche unterbrochen. C. kommen niemals in Schleifen vor, damit keine delete s durch continue/goto übergangen werden. D. werden alle erkannt und der Speicher freigegeben. findet
Ich mache direkt alles richtig. void f() { double *ptr = new double(0.); delete(ptr); Zu jedem new() gibt es auch ein delete(). Funktionen, die Speicher allokieren und diesen als Rückgabe liefern... A. gibt es bei mir nicht. B. werden niemals in... durch Exceptions oder Abbrüche unterbrochen. C. kommen niemals in Schleifen vor, damit keine delete s durch continue/goto übergangen werden. D. werden alle erkannt und der Speicher freigegeben. findet
Ich mache direkt alles richtig. void f() { double *ptr = new double(0.); delete(ptr); Zu jedem new() gibt es auch ein delete(). Funktionen, die Speicher allokieren und diesen als Rückgabe liefern... A. gibt es bei mir nicht. B. werden niemals in... durch Exceptions oder Abbrüche unterbrochen. C. kommen niemals in Schleifen vor, damit keine delete s durch continue/goto übergangen werden. D. werden alle erkannt und der Speicher freigegeben. findet
Ich bette new/delete s in Objekte ein. template <typename T> MemoryContainer { MemoryContainer(T *ptr) : mem_ptr(ptr) {; MemoryContainer() { delete(mem_ptr); ; private: T * mem_ptr; double * f(double val){return new double(val); { MemoryContainer<double> Container( f(0.) ); findet Es gibt keine delete()s. Alle delete s erfolgen in Destruktoren eigens dafür geschaffener Containerobjekte.
Ich bette new/delete s in Objekte ein. template <typename T> MemoryContainer { MemoryContainer(T *ptr) : mem_ptr(ptr) {; MemoryContainer() { delete(mem_ptr); ; private: T * mem_ptr; double * f(double val){return new double(val); { MemoryContainer<double> Container( f(0.) ); findet Es gibt keine delete()s. Alle delete s erfolgen in Destruktoren eigens dafür geschaffener Containerobjekte.
Ich bette new/delete s in Objekte ein. template <typename T> MemoryContainer { MemoryContainer(T *ptr) : mem_ptr(ptr) {; MemoryContainer() { delete(mem_ptr); ; private: T * mem_ptr; double * f(double val){return new double(val); { MemoryContainer<double> Container( f(0.) ); findet Es gibt keine delete()s. Alle delete s erfolgen in Destruktoren eigens dafür geschaffener Containerobjekte.
Es gibt für jeden Speicherbereich nur einen gültigen Pointer. void f() { std::auto ptr<double> ptr(new double(0.)); auto ptr funktioniert fast wie ein richtiger Pointer. Aber nur fast... findet std::auto ptr<double> ptr(new double(0.)); std::auto ptr<double> ptr2(ptr); // ptr ist nun NULL! cout << ptr << " " << *ptr << endl;
Es gibt für jeden Speicherbereich nur einen gültigen Pointer. void f() { std::auto ptr<double> ptr(new double(0.)); auto ptr funktioniert fast wie ein richtiger Pointer. Aber nur fast... findet std::auto ptr<double> ptr(new double(0.)); std::auto ptr<double> ptr2(ptr); // ptr ist nun NULL! cout << ptr << " " << *ptr << endl;
Es gibt für jeden Speicherbereich nur einen gültigen Pointer. void f() { std::auto ptr<double> ptr(new double(0.)); auto ptr funktioniert fast wie ein richtiger Pointer. Aber nur fast... findet std::auto ptr<double> ptr(new double(0.)); std::auto ptr<double> ptr2(ptr); // ptr ist nun NULL! cout << ptr << " " << *ptr << endl;
Es gibt für jeden Speicherbereich nur einen gültigen Pointer. void f() { std::auto ptr<double> ptr(new double(0.)); auto ptr funktioniert fast wie ein richtiger Pointer. Aber nur fast... findet std::auto ptr<double> ptr(new double(0.)); std::auto ptr<double> ptr2(ptr); // ptr ist nun NULL! cout << ptr << " " << *ptr << endl;
Boost sorgt für sichere Freigabe. void f() { boost::shared ptr<double> ptr(new double(0.)); Boosts smart pointer funktionieren wie ein richtiger Pointer. Achtung, es können keine Zirkelreferenzen erkannt werden. Ihre Verwendung ergibt also keine sorglose Garbage Collector-Funktion. findet
Boost sorgt für sichere Freigabe. void f() { boost::shared ptr<double> ptr(new double(0.)); Boosts smart pointer funktionieren wie ein richtiger Pointer. Achtung, es können keine Zirkelreferenzen erkannt werden. Ihre Verwendung ergibt also keine sorglose Garbage Collector-Funktion. findet
Boost sorgt für sichere Freigabe. void f() { boost::shared ptr<double> ptr(new double(0.)); Boosts smart pointer funktionieren wie ein richtiger Pointer. Achtung, es können keine Zirkelreferenzen erkannt werden. Ihre Verwendung ergibt also keine sorglose Garbage Collector-Funktion. findet
http://www.valgrind.org/ ist eine Programmsuite mit Memchecker Sucht nach Speicherlecks und nicht-initialisierten Variablen. Cachegrind Prüft die Performance der Cache-Nutzung des Programmcodes. Callgrind Produziert einen Aufrufgraphen des Programmscodes mit darin verbrachten Laufzeitanteilen. Helgrind/DRD Prüft (Synchronisations-)Fehler in Thread-basierten Programmen. Massif Prüft die Effizienz der Heapspeicherverwendung und des Stacks. Ptrcheck Sucht nach Bufferüberläufen, falschen Speicherzugriffen. findet
Aufruf per Kommandozeile./valgrind [OPTIONS] [PROGRAMM and options] -v Ausführlicherer Output von Programmfehlern - -leak-check=full Vollständige und umfangreichere Suche nach Speicherlecks - -show-reachable=yes Zeig an, ob Speicher immer noch erreichbar ist (d. h. einfach nur nicht sinnvoll freigegeben wurde) - -db-attach=yes Startet einen Debugger an der Stelle, wo gerade ein Fehler erkannt wurde. findet
Aufruf in Eclipse dank Linux Tools Project findet
Liste möglicher Fehler illegal read/write - Lesen/Schreiben über Array-Grenzen hinaus oder in nicht-allokierten Speicherzellen Conditional jump or move depends of uninitialised value(s) - Nicht-initialisierte Variable wird benutzt Syscall param points to uninitialized byte(s) - Nicht-initialisierte Variablen wird für Syscalls benutzt. invalid free() - Zweimaliges Freigeben oder Freigeben von nicht-allokierten Bereichen. Mismatched free() / delete / delete[ ] - Mit new[] allokierte Bereiche durch free() freigeben anstatt delete[]. findet
http://valgrind.org/ Scott Meyers, Effektiv C++ programmieren, Addison-Wesley, 2006. http://www.boost.org/doc/libs/1 40 0/libs/smart ptr/ http://ootips.org/yonat/4dev/smart-pointers.html findet