10 Möglichkeiten, Bugs in C ++ zu vermeiden

Es ist eine bedauerliche Tatsache, dass Sie mehr Zeit für die Suche und das Entfernen Fehler ausgeben, als Sie verbringen tatsächlich Ihre C ++ Programme in erster Linie zu schreiben. Die Vorschläge können dabei helfen, die Anzahl der Fehler, die Sie in Ihre Programme einführen minimieren ein angenehmeres Erlebnis zu machen Programmierung.

Aktivieren Sie alle Warnungen und Fehlermeldungen

Die Syntax von C ++ ermöglicht eine viel Fehlerprüfung. Wenn der Compiler ein Konstrukt Begegnungen, die es einfach nicht entziffern, es hat keine andere Wahl, als zur Ausgabe einer Nachricht. Es wird versucht, die Synchronisierung wieder mit dem Quellcode (manchmal weniger als erfolgreich), aber es wird nicht eine ausführbare Datei erzeugen. Dies zwingt den Programmierer alle Fehlermeldungen zu beheben.

Wenn jedoch C ++ über eine Struktur kommt, die es herausfinden können, aber die Struktur riecht fischig sowieso, erzeugt C ++ eine Warnmeldung aus. Weil C ++ ziemlich sicher ist, dass es versteht, was Sie wollen, es geht voran und erstellt eine ausführbare Datei, so dass Sie Warnungen ignorieren, wenn Sie mögen. In der Tat, wenn Sie wirklich wollen nicht gestört werden, können Sie Warnungen deaktivieren.

Deaktivieren oder auf andere Weise zu ignorieren Warnungen ist eine außerordentlich schlechte Idee. Es ist ein bisschen wie das Ausstecken # 147-Check-Engine # 148- Licht auf das Armaturenbrett Ihres Autos, weil es dich stört. nicht ignorieren das Problem nicht weg zu gehen.

Nehmen Sie eine klare und einheitliche Codierung Stil

Schreiben Sie Ihre C ++ Code in einer klaren und konsistenten Stil verbessert nicht nur die Lesbarkeit des Programms, sondern auch kommt es zu weniger Codierung Fehler. Diese etwas überraschend Sachverhalt ergibt sich aus der Tatsache, dass unser Gehirn nur eine begrenzte Menge an Rechenleistung.

Wenn Sie Code lesen, die sauber und ordentlich ist und dass folgt einer Art, die Sie mit vertraut sind, verbringen Sie sehr wenig Energie Gehirn die Syntax der C ++ Aussagen Parsen. So bleibt mehr Gehirn CPU-Leistung zu entschlüsseln, was das Programm versucht, wie zu tun und es nicht tut es.

Eine gute Art der Programmierung können Sie folgendes tun mit Leichtigkeit:

  • Differenzieren zwischen Klassennamen, Objektnamen und Funktionsnamen

  • Verstehen Sie, was die Klasse, Funktion oder Objekt für verwendet wird, basierend auf seinen Namen

  • Differenzieren Präprozessorsymbole von C ++ Symbole (das heißt, #definieren Objekte abheben sollte)

  • Identifizieren Sie Blöcke von C ++ Code auf dem gleichen Niveau (das das Ergebnis einer konsequenten Vertiefung ist)

Darüber hinaus müssen Sie ein Standardformat für Ihr Modul-Header zu schaffen, die Informationen über die Funktionen oder Klassen in jedem Modul, den Autor, das Datum, die Version, und etwas über die Änderungshistorie zur Verfügung stellt.

Alle in einem einzigen Projekt beteiligten Programmierer sollten die gleiche Art der Programmierung verwenden. Ein Programm, geschrieben in einem Flickenteppich von unterschiedlichen Codierungs Stile ist verwirrend und sieht unprofessionell.

Kommentieren Sie den Code, während Sie es schreiben

Sie können Fehler vermeiden, wenn Sie Ihren Code kommentieren, während Sie es schreiben, anstatt, bis alles funktioniert warten und dann Kommentare zurück gehen und hinzufügen.

Formulieren Sie Kommentare Kräfte Bilanz zu ziehen, was Sie zu tun versuchen. Kurze Kommentare sind aufschlussreich, sowohl wenn Sie lesen, um sie später und wie Sie schreiben sie. Schreiben Sie Kommentare, als ob Sie im Gespräch mit einem anderen, sachkundig Programmierer.

Single-step jeder Pfad im Debugger mindestens einmal

Als Programmierer müssen Sie verstehen, was Ihr Programm tut. Es reicht nicht aus, dass das Programm den Erwartungswert ausgibt. Sie müssen verstehen, alles, was das Programm tut. Nichts gibt Ihnen ein besseres Gefühl für das, was unter der Haube vor sich geht als Einzelschritt Das Programm, das die Ausführung es Schritt mit einem guten Debugger (wie das Schritt, der mit kommt Code :: Blocks).

Darüber hinaus, wie Sie ein Programm debuggen, müssen Sie Rohstoff etwas bizarres Verhalten, um herauszufinden, die als das Programm läuft auftauchen könnten. Nichts gibt Ihnen das Material besser als in Einzelschritten durch jede Funktion, wie es in Betrieb geht.

Schließlich, wenn eine Funktion fertig und bereit ist, um das Programm hinzugefügt werden, muss jeder logischen Pfad mindestens einmal zu fahr. Bugs sind viel leichter zu finden, wenn Sie die Funktion selbst untersuchen und nicht, nachdem es mit dem Rest der Funktionen in den Topf geworfen wurde - bis dahin, Ihre Aufmerksamkeit auf neue Programmierung Herausforderungen gegangen.

Begrenzen Sie die Sichtbarkeit

Die Begrenzung der Sichtbarkeit der Klasse Interna an die Außenwelt ist ein Eckpfeiler der objektorientierten Programmierung. Die Klasse sollte für seinen internen Zustand verantwortlich sein - wenn etwas in der Klasse vermasselt wird, dann ist es die Schuld des Klasse-Programmierer. Der Anwendungsprogrammierer sollten über die Lösung des Problems auf der Hand zu kümmern.

Konkret bedeutet eingeschränkte Sicht, dass Datenelemente nicht außerhalb der Klasse zugänglich sein sollte - das heißt, sollten sie als geschützt markiert werden. Darüber hinaus, die Member-Funktionen der Anwendungssoftware nicht zustande müssen wissen, sollte auch markiert werden geschützt. Sie nicht mehr der Klasse Interna als nötig aussetzen den Job zu erledigen.

Verfolgen Sie Heap-Speicher

Verlieren des Heap-Speichers ist die häufigste Ursache für schwere Fehler in Programmen, die in das Feld freigelassen wurden - und zugleich die schwierigste Problem aufzuspüren und zu entfernen. (Da diese Klasse von Fehler ist so schwer zu finden und zu entfernen, ist es weit verbreitet in Programmen, die Sie kaufen.) Sie müssen möglicherweise ein Programm für Stunden laufen, bevor Probleme (je nachdem, wie groß der Speicherverlust ist) beginnen zu entstehen.

Als allgemeine Regel gilt, Programmierer sollten immer Heap-Speicher auf dem gleichen zuweisen und freigeben # 147-Ebene. # 148- Wenn ein Funktionselement MyClass :: create () einen Block von Heap-Speicher reserviert, und gibt sie an den Anrufer, dann sollte es ein Mitglied sein MyClass :: Release () dass gibt es an den Heap. Speziell, MyClass :: create () sollte nicht die übergeordnete Funktion erfordern den Speicher freizugeben.

Wenn überhaupt möglich, Meine Klasse verfolgen solche Speicherzeiger sollte sich auf seine eigene, und löschen Sie sie in der destructor.

Zero-out-Zeiger nach dem Löschen, was sie zeigen auf

Stellen Sie sicher, dass Sie Zeiger Null aus, nachdem sie nicht mehr sind Gül- Sie dies tun, indem sie den Wert zuweisen nullptr. Die Gründe für diese Maßnahme werden klar mit Erfahrung: Sie können einen Speicherblock weiterhin zu verwenden, die auf dem Heap zurückgegeben wurde und nicht einmal wissen. Ein Programm könnte feinen 99 Prozent der Zeit laufen, ist es sehr schwierig macht, die 1 Prozent der Fälle zu finden, wo der Block neu zugeordnet wird, und das Programm funktioniert nicht.

Wenn Sie Zeiger Null zu bringen, die nicht mehr gültig sind und Sie versuchen, sie zu verwenden, um einen Wert zu speichern (Sie können nicht an oder nahe der Null-Position speichern alles), wird Ihr Programm sofort zum Absturz bringen. Crashing klingt schlecht, aber es ist nicht, ob es ein Problem macht. Das Problem ist, Des- es ist nur eine Frage, ob Sie es finden oder nicht, bevor es in die Produktion bringen.

Verwenden Sie Ausnahmen Fehler behandeln

Der Ausnahmemechanismus in C ++ ist so konzipiert, Fehler bequem und effizient zu handhaben. In der Regel sollten Sie eine Fehleranzeige, anstatt einen Fehler zurück Flagge werfen. Der resultierende Code ist einfacher zu schreiben, zu lesen und zu pflegen. Außerdem haben andere Programmierer kommen, um es zu erwarten ist, und man würde sie nicht enttäuschen wollen, würden Sie?

Beschränken Sie Ihre Verwendung von Ausnahmen zu wahren Fehler. Es ist nicht erforderlich, eine Ausnahme von einer Funktion zu werfen, die eine zurück # 147-nicht funktionierte # 148- Indikator dafür, ob diese für diese Funktion ein Teil des täglichen Lebens ist.

Deklarieren Destruktoren virtuell

Vergessen Sie nicht, einen Destruktor für die Klasse zu erstellen, wenn der Konstruktor Ressourcen wie Heap-Speicher reserviert, die müssen zurückgegeben werden, wenn das Objekt seine endgültige Niedergang erreicht. Nachdem ein destructor erstellt, vergessen Sie nicht, es virtuell zu erklären.

# 147-Aber, # 148- Sie sagen, # 147-my-Klasse erbt nicht von irgendetwas, und es ist nicht von einer anderen Klasse als Unterklasse. # 148- Ja, aber es könnte werden eine Basisklasse in der Zukunft. Es sei denn, Sie haben einige gute Gründe haben, nicht der Destruktor virtuell deklarieren, dann tun, wenn Sie zuerst die Klasse zu erstellen.

Geben Sie eine Kopie Konstruktor und überladenen Zuweisungsoperator

Wenn Ihre Klasse einen Destruktor braucht, braucht es fast sicher einen Kopierkonstruktor und einen überladenen Zuweisungsoperator. Wenn Ihr Konstruktor Ressourcen wie Heap-Speicher zuweist, wird die Standard-Copy-Konstruktor und Zuweisungsoperator nichts tun, sondern Chaos erzeugen, indem mehrere Zeiger auf die gleichen Ressourcen zu erzeugen.

Wenn der Destruktor für eines dieser Objekte aufgerufen wird, wird das Vermögen wiederherzustellen. Wenn die destructor für die andere Kopie zusammen kommt, wird es Dinge vermasseln.

Menü