Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

FSA

Community-Fossil

  • Private Nachricht senden

21

25.08.2012, 14:30

Wenn man den Zeiger aber auf NULL setzt, dann weiß man nicht das man etwas falsch gemacht hat. Also das hat alles seine Vor- und Nachteile...

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Moe

Frischling

Beiträge: 85

Wohnort: München

  • Private Nachricht senden

22

25.08.2012, 18:19

Meistens ist genau der Wert NULL das Signal, dass etwas schief gegangen ist. Für mich ist der wichtigste Vorteil, dass der NULL-Zeiger keine Seiteneffekte erzeugen kann, wenn man ihn aus Versehen verwendet, sondern kontrolliert abstürtzt. :thumbsup:

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

23

25.08.2012, 22:59

sondern kontrolliert abstürtzt

Und genau da irrst du dich. Die Benutzung eines 0-Zeigers ist undefiniert. Dein Programm kann crashen oder ohne Probleme weiterlaufen. Beide Fälle passieren in der Regel auch.

Ich verwende 0-Zeiger nie um anzuzeigen, dass etwas schief gelaufen ist, sondern als regulären Wert, der eben das bedeutet: Kein Objekt verknüpft. 0-Zeiger benutze ich also by design. Das passiert dann eigentlich immer als Argument einer Funktion, wo man optional ein Objekt angeben kann, dass dann etwas macht. Wenn man einen Zeiger als Daten-Member hat, dann sollte da wahrscheinlich auch ein Smart Pointer her (Weak reference z.B.).
Die Aussagen in dem Thread mögen vielleicht so wirken, dass Zeiger nie 0 sein sollten, aber das ist wohl nicht gemeint, sondern man sollte sich anders benutzen. Gemeint ist aber aber wohl hauptsächlich: Mach keine manuelle Speicherverwaltung, sondern benutz Smart Pointer, passende Container etc., etc.

Moe

Frischling

Beiträge: 85

Wohnort: München

  • Private Nachricht senden

24

26.08.2012, 00:27

Und genau da irrst du dich. Die Benutzung eines 0-Zeigers ist undefiniert. Dein Programm kann crashen oder ohne Probleme weiterlaufen. Beide Fälle passieren in der Regel auch.
Falsch. Ein Zugriff auf NULL-Speicher ist eben nicht undefiniert sondern führt zum Absturz. Mir ist auch noch nie untergekommen, dass dereferenzieren oder andere Pointeroperationen auf NULL nicht abgestürtzt wären. NULL steht eben für "kein gültiger Speicherbereich" und jede Laufzeitumgebung muss das mit einem Absturz quittieren - außer man fängt die Exception.
Eine Ausnahme sind arithmetische Funktionen, dann rechnet man ja mit Integern und erzeugt einen theoretisch gültigen Zeiger.
Viele Libs prüfen auf NULL-Pointer, deswegen stürtzt da nichts ab.

NULL verwende ich auch, wenn ich einen Parameter "ausschalten" will. Aber wie soll eine Funktion, die ein Objekt anlegen soll, anzeigen, dass es eben nicht geklappt hat? Jetzt sag nicht Exceptions...

Zitat

Die Aussagen in dem Thread mögen vielleicht so wirken, dass Zeiger nie 0
sein sollten, aber das ist wohl nicht gemeint, sondern man sollte sich
anders benutzen. Gemeint ist aber aber wohl hauptsächlich: Mach keine
manuelle Speicherverwaltung, sondern benutz Smart Pointer, passende
Container etc., etc.
Der Thread klingt so, als ob alle Smart-Pointer verwenden und in letzter Zeit nicht viel mit Pointern gemacht haben...

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

25

26.08.2012, 00:57

Einfach mal etwas behaupten, ja.. :rolleyes:
Wenn du es mir nicht glaubst, dann lies es doch selbst im Standard nach:

Zitat von »8.3.2/4«

Note: in particular, a null reference cannot exist in a well-defined program, because the only way to create such a reference would be to bind it to the “object” obtained by dereferencing a null pointer, which causes undefined behavior.

Es wäre auch völlig hirnrissig Absturz vorzuschreiben, daher: Undefiniertes Verhalten, weil jeder Compiler Hersteller in dem Fall machen kann was er will.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

26

26.08.2012, 01:05

Ein Zugriff auf NULL-Speicher ist eben nicht undefiniert sondern führt zum Absturz. Mir ist auch noch nie untergekommen, dass dereferenzieren oder andere Pointeroperationen auf NULL nicht abgestürtzt wären. NULL steht eben für "kein gültiger Speicherbereich" und jede Laufzeitumgebung muss das mit einem Absturz quittieren - außer man fängt die Exception.

Dazu hat drakon ja schon alles gesagt.

Eine Ausnahme sind arithmetische Funktionen, dann rechnet man ja mit Integern und erzeugt einen theoretisch gültigen Zeiger.

Genaugenommen kann es sogar allein schon beim Ausrechnen ungültiger Zeiger theoretisch zu undefiniertem Verhalten kommen, da braucht man noch nichtmal drauf zugreifen...

Aber wie soll eine Funktion, die ein Objekt anlegen soll, anzeigen, dass es eben nicht geklappt hat? Jetzt sag nicht Exceptions...

Wieso nicht?

Der Thread klingt so, als ob alle Smart-Pointer verwenden und in letzter Zeit nicht viel mit Pointern gemacht haben...

Smartpointer sind kein Ersatz für Pointer. Wer das glaub, hat Smartpointer nicht verstanden.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (26.08.2012, 01:11)


Moe

Frischling

Beiträge: 85

Wohnort: München

  • Private Nachricht senden

27

26.08.2012, 01:38

Zitat

drakon

Es wäre auch völlig hirnrissig Absturz vorzuschreiben, daher:
Undefiniertes Verhalten, weil jeder Compiler Hersteller in dem Fall
machen kann was er will.
Okay, mein Fehler, ich wollte eigentlich auf NULL-Speicherzugriffe hinaus :dash: - ich wollte auch schon editieren, aber ihr habt meinen Fehler sofort aufgedeckt.

Zitat

dot
Wieso nicht?
Weil es immer wieder Projekte gibt, die vorschreiben, sie nicht zu verwenden. Und es gibt Compiler/Plattformen, die das gar nicht erst unterstützen...

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

28

26.08.2012, 01:47

Nun, wir gingen davon aus, dass du den Zugriff auf ein Objekt über einen Nullpointer meinst. Oder was genau verstehst du unter einem "NULL-Speicherzugriff"?

Zitat

dot
Wieso nicht?
Weil es immer wieder Projekte gibt, die vorschreiben, sie nicht zu verwenden. Und es gibt Compiler/Plattformen, die das gar nicht erst unterstützen...

Ja, z.B. in Embedded Systems, hard real-time Computing oder der untersten Schicht eines Betriebssystem Kernels, sind Exceptions oft aus technischen Gründen tatsächlich keine Option!? Das heißt aber noch lange nicht, dass man sie im Allgemeinen nicht verwenden kann oder gar meiden sollte...

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »dot« (26.08.2012, 01:56)


Moe

Frischling

Beiträge: 85

Wohnort: München

  • Private Nachricht senden

29

26.08.2012, 02:39

Nun, wir gingen davon aus, dass du den Zugriff auf ein Objekt über einen Nullpointer meinst. Oder was genau verstehst du unter einem "NULL-Speicherzugriff"?
Ich meinte den schreibenden Zugriff:

C-/C++-Quelltext

1
2
int *p = NULL;
*p = 5;

Sowas signalisiert der Prozessor als Fehler und da ist mir noch nie untergekommen, dass das Betriebssystem nicht die Anwendung abgeschossen hat, bzw. kein Segfault-Signal geschickt hat, das im Standardfall (ohne Handler) die Anwendung abschießt. Aber wenn ich darüber nachdenke, ist es nicht C++, das für den Fehler sorgt und ich hab da wohl ein paar Sachen verdreht... :hmm:

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

30

26.08.2012, 02:55

Null ist für die CPU eine perfekt gültige Adresse. Allerdings wird kaum ein Betriebssystem dort Speicher mappen, weshalb man in der Tat wohl praktisch immer mit einer Access Violation rechnen kann. Das ist imo auch eines der sinnvolleren Argumente für das Nullsetzen von Zeigern nach delete. Ich bin trotzdem der Meinung, dass man schon dabei ist, etwas falsch zu machen, wenn sich überhaupt nur die Gelegenheit ergibt, darüber nachzudenken, ob man einen Zeiger nach delete nun auf Null setzen soll oder nicht...

Werbeanzeige