PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : FAQ: Tipps und Hinweise für sauberes sicheres C++ coden


Gast
2007-10-06, 06:54:51
Diese FAQ soll eine Ansammlung an Tipps und Hinweisen werden, um sauberes, sicheres und daher auch möglichst fehlerfreies C++ coden zu ermöglichen.

Jeder der will, der kann hier weitere Tipps und Ratschläge, die die Qualität
des C++ Codes erhöhen, geben.




Hier sind meine Tipps:
==================================================
1. Beim erstellen von Zeigern am besten den Sternoperator * an den Zeigernamen anstatt an den Typ anheften.
Dies verhindert, daß bei Mehrfachnennungen ausversehen eine Variable anstatt ein Zeiger erstellt wird:

int* a, b; // a ist ein Zeiger, aber b ist eine int Variable!
int *a, *b; // a und b sind hier beides Zeiger, das anheften des
// Sternoperators an den Zeigernamen anstatt an den Zeigertyp
// vermeidet also unvorgesehene Fehler


==================================================
2. Zeiger sollten unmittelbar nach der Deklaration immer initialisiert werden. Dazu gibt es auch den Nulloperator:

int *zeiger = 0;


==================================================
3. Bevor man auf einen Zeiger zugreift, sollte man sicherstellen, daß er auch auf ein existierendes
Objekt zeigt:

if (zeiger)
*zeiger = 10;

Wenn man sich strikt an Regel Nr 2 hält und immer einen Nullzeiger für leere Zeiger einsetzt, dann kann man damit obige if Abfrage benutzen.

==================================================
4. Zur Dereferenzierung von Objektelementen ausschließlich den Operator -> einsetzen.
Also anstatt

(*student).matNr = 123456;

besser

student->matNr = 123456;

schreiben.
Dies ist eine bessere Schreibweise, da man so die Klammerung nicht außversehen vergißt.
Der Punktoperator hat nämlich Vorrang, vor dem Sternoperator
und bei vergessen der Klammerung kann das zu schweren Fehlern führen.







Wenn ihr selber noch weitere Tips und wichtige Hinweise habt, dann könnt ihr die jetzt hier in diesem Thread darunter schreiben.


Auch wäre es klasse, wenn ein Mod an diese FAQ noch ein Sticky Bit setzen könnte.

Gast
2007-10-06, 12:14:50
5. Nach Speicherreservierung Rückgabe überprüfen.
Dies ist notwendig, um das Programm kontrolliert fortfahren oder beenden zu können (Ausnahmebehandlung),
wenn kein neuer Speicher mehr reserviert werden kann, was der Fall ist, wenn der Rückgabewert z.b. 0 ist.

student *zeiger = new student;
if (!zeiger) {
cerr << "Kein Speicher mehr verfügbar!" << endl;
exit (1);
}


==================================================
6. Nach dem löschen eines Objekts mit delete sollte man den dafür benutzen Zeiger anschließend auf 0 setzen.
Denn es darf kein Objekt mehrmals mit delete gelöscht werden, da dies sonst zum Absturz führt.
Ein delte auf einen Nullzeiger bleibt dagegen aber wirkungslos, ein Nullzeiger ist also ein Schutz gegen
ein ausversehen unbeabsichtigtes nochmaliges Löschen eines schon gelöschten Objekts.
Student *zeiger = new Student;
delete zeiger;
zeiger = 0; // verhindert das auf bereits gelöschtes Objekt nochmal mit delete zugegriffen werden kann, was ansonsten zum Absturz führen würde.
delete zeiger; // ok, da zeiger 0 ist passiert nicht viel.


==================================================
7. Memory Leaks vermeiden. D.h. niemals den Zugriff auf ein im Speicher reserviertes Objekt verlieren,
da man dieses sonst via delete nicht mehr löschen und den Speicherplatz freigeben kann.
Hinweis: Die Speicherreservierung ist unabhängig von Blöcken und Funktionen, d.h. der mit dem new Operator
reservierte Speicher bleibt auch noch dann reserviert, wenn man diese Blöcke oder Funktionen verläßt.

Gast
2007-10-09, 11:12:33
Also nochmal zur Erinnerung, ihr seid alle herzlich dazu eingeladen, diese FAQ zu verbessern.

Coda
2007-10-09, 12:04:26
new gibt kein 0 zurück wenn es keinen Speicher mehr zur Verfügung hat, sondern schmeißt eine Exception.

Gast
2007-10-23, 15:01:54
Kann ein Mod mal ein Sticky Bit setzen?

Gast
2007-10-24, 08:57:17
3. Bevor man auf einen Zeiger zugreift, sollte man sicherstellen, daß er auch auf ein existierendes
Objekt zeigt:

if (zeiger)
*zeiger = 10;

Wenn man sich strikt an Regel Nr 2 hält und immer einen Nullzeiger für leere Zeiger einsetzt, dann kann man damit obige if Abfrage benutzen. Da sagt Dir ja nur aus, ob Du eine Adresse größer 0 hast. Du mußt auch beim Löschen das Ding wieder auf 0 setzen, wenn mehrere Objekte einen Pointer haben, weiß man da aber noch gar nichts; außerdem muß ja nicht immer ein Delete/NULL-setzen auch erreicht werden ... "sicher" ist das auf jeden Fall nicht.