Möglichkeiten zur Vermeidung von Speicherlecks in C/C++
Was sind einige Tipps, die ich verwenden können, um Speicherverluste zu vermeiden in meine Anwendungen? In meinem aktuellen Projekt verwende ich ein tool "VERSICHERN++" findet der Speicherverlust und den Bericht zu erstellen.
Neben dem tool gibt es eine Methode, die memory leaks zu erkennen und zu überwinden.
Sind Sie mit C oder C++? Die verfügbaren Lösungen sind Recht unterschiedlich für die beiden Sprachen.
Ich bin mit C. Können Sie bitte geben Sie eine Auflösung für C und C++
Auch eine Antwort, die Sinn macht für C ist nicht sinnvoll, C++ und vice versa. Speicher-management ist eines der bits, die sich ändern in C++.
Keine C-Lösung zu verwenden, die in C sein wird, Wert, mit in C++, da C++ bietet extrem radikal verschiedene Lösungen.
Ich bin mit C. Können Sie bitte geben Sie eine Auflösung für C und C++
Auch eine Antwort, die Sinn macht für C ist nicht sinnvoll, C++ und vice versa. Speicher-management ist eines der bits, die sich ändern in C++.
Keine C-Lösung zu verwenden, die in C sein wird, Wert, mit in C++, da C++ bietet extrem radikal verschiedene Lösungen.
InformationsquelleAutor Ankur | 2010-06-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es gibt drei wichtigsten Möglichkeiten, dies zu tun.
Die erste ist die nicht erstellen Speicherverluste in den ersten Platz. Defensive Programmierung Techniken sind hier von unschätzbarem Wert. Sehen Sie diese hervorragende Präsentation für eine Zusammenfassung dieser Fragen, oder das entsprechende Kapitel in Sichere C-Codierung. Ich bin mehr vertraut mit C als C++, aber ich verstehe, dass C++'s intelligente Zeiger sind hier nützlich.
Einem zweiten Ansatz statische Analyse, die versucht, zu erkennen Fehler in deinem source-code. Das erste Werkzeug in dieser Kategorie ist lint, die ist jetzt leider veraltet. Die besten tools, soweit ich weiß, sind kommerzielle wie coverty. Jedoch, einige Kostenlose tools existieren.
Der Dritte Ansatz ist das aufspüren von memory leaks zur Laufzeit, wie VERSICHERN++ tut. Valgrind ist hier hervorragend und sehr zu empfehlen. Es kann helfen, fangen bugs, die Sie bereits eingeführt haben. Es ist besonders hilfreich, wenn Sie eine test-suite, hat eine gute code coverage.
InformationsquelleAutor fmark
C, eine gute code-Organisation hilft. I. e. werfen Sie keine Aufrufe von malloc() und free() alle über Ihre Codebasis. Zentralisieren Sie die beiden Funktionen, dann haben Sie eine einzige Anlaufstelle für alle die checkings. Das einfachste könnte sein, die Anzahl der erfolgreichen Anrufe und überprüfen Sie auf Programm beenden, dass Sie ausgeglichen sind.
Können Sie weiterhin diese für die verschiedenen Daten-Strukturen. Überall dort, wo Sie brauchen, um Speicher für eine Zeichenfolge, verwenden Sie mystr_alloc und mystr_free. Und so weiter. Wenn ein Leck erkannt wird, auf diese Weise können Sie schnell einzugrenzen.
Sagen, dass, würde diese Methode immer noch nützlich sein, aber ich würde sicherlich wollen, dass es die Nutzung bedingte: es ersetzt malloc/free für debug-builds, aber malloc/free verwendet wird, in release-builds.
Ich gehe mit der create - /destroy-Ansatz zu. Aber dort, wrapper-Funktionen für malloc/free ähnlich sind diese immer verwendet, ein bisschen mehr verfeinert, wie in diesem Beispiel, natürlich. Die Fehlerbehandlung Teil ist immer notwendig, und wenn etwas ist immer notwendig beim Aufruf einer library-Funktion, dann sollte es entweder ein Teil der Funktion selbst oder in einem wrapper, wenn die manipulation der Funktion ist nicht möglich, über die DRY-Prinzip. stackoverflow.com/questions/1529679/...
Sagen, dass (mich auch ;), was ist Ihr Grund, es zu machen, bedingte?
Die grundlegende Idee, dass es kompilieren bedingt ist, zu entfernen, was meiner Meinung nach ist das Debuggen von code aus der release-build.
InformationsquelleAutor Secure
Smart-Pointer kann sehr hilfreich bei der Automatisierung der Buchhaltung der Objekt-Lebenszeiten:
http://ootips.org/yonat/4dev/smart-pointers.html
Wo möglich, verwenden Sie Stapel zugewiesenen Objekte, die sich innerhalb Ihrer jeweiligen Bereiche statt new/delete.
Tools wie valgrind ein gewisser Aufwand und verlangsamen kann Ihr läuft. Wenn Sie wissen, dass Ihre Codebasis und die Arten von Lecks, die dazu neigen, auftreten, können Sie sich auf bestimmte Klassen und implementieren leichtere Prüfungen (auch wenn es nur ein einfaches Objekt, das zählen, dass Sie gegen null, wenn Sie beenden). Diese leichte Prüfungen können dann verwendet werden, um Sie zu motivieren, das zu tun-eine ausführliche valgrind debugging-Sitzung, wenn Sie ausgelöst werden.
InformationsquelleAutor HostileFork
Reden wir Werkzeuge, um Lecks zu finden, oder Möglichkeiten, um code, um Sie zu vermeiden?
Für die ehemaligen, die oben genannten valgrind oder Rational suite von IBM-tools, wenn Sie eine Lizenz haben. Dr. Dobbs empfohlen, CompuWare BoundsChecker, aber das war 2002.
Für die spätere, siehe:
C++ - idiom, um Speicherverluste zu vermeiden?
http://www.cprogramming.com/tutorial/memory_debugging_parallel_inspector.html
http://scottmcpeak.com/memory-errors/
http://www.yolinux.com/TUTORIALS/C++MemoryCorruptionAndMemoryLeaks.html
InformationsquelleAutor DVK
Verwenden Sie ein smart-pointer wie
std::shared_ptr<t>
(C++0x),std::tr1::shared_ptr<t>
(TR1), oderboost::shared_ptr<t>
. Natürlich ist diese Lösung funktioniert nur mit C++ - Sie sind auf Ihre eigenen in C.InformationsquelleAutor Billy ONeal
Zu vermeiden oder zu erkennen? Um zu vermeiden, zuerst erkennen und zu versuchen zu verstehen, wo und warum... eine Andere Möglichkeit wäre der Einsatz eines GC-Bibliothek, wie die hier beschriebenen, aber andere (vielleicht bessere) Bibliotheken existieren können.
InformationsquelleAutor ShinTakezou