Frage zu Exceptions
-
Ne, ist immer UB. Zumindest was den C++ Standard angeht. Aber sollte das Ziel nicht eher sein, solche Zugriffe zu verhindern? Oo
-
Du kannst einen Wrapper bauen, wo du deine Zeiger rein tust und dann kannst du 0-Dereferenzierungen abfangen und eine Exception werfen. Der Wrapper könnte theoretisch dann wiederum ein Problem sein, aber wenn du den nicht per new anforderst sollte nie was passieren.
Eine Art solcher Wrapper sind dann die Smart Pointer, welche dir noch weitere Vorteile bringen gegenüber rohen Zeigern.
-
Nikolai schrieb:
es ist nur ein schnelles beispiel aber ich will das programm nicht crashen lassen wenn auf ein nicht existierendes objekt zugegriffen wird. geht das nicht irgendwie?
Ja. Indem du so programmierst, dass dieser Fall gar nicht eintreten kann. Das ist nicht schwer. Ein Anfang wäre, dass du keine expliziten new und delete benutzt. Denn wenn du sagst, dass dieser Fall bei dir überhaupt vorkommt, dann kann ich nur folgern, dass du eben dies getan hast und dein Beispiel trotz
Nikolai schrieb:
es ist nur ein schnelles beispiel
wohl doch nicht so weit von einem deiner echten Programme entfernt ist.
Das ist an sich nicht schwer, wenn man nur die Grundregeln sauberer Programmierung beachtet. Das sollte in einem (guten!) Anfängerbuch alles ausführlich erklärt werden und steht auch in jedem Stilratgeber zu C++. Wenn du in C++ sauber programmierst, dann kann gar kein Fehler dieser Art mehr auftreten.
-
ich soll keine new und delete benutzen? was wenn ich ein array hab wo hunderte clients gespeichert werden sollen. wie soll das ohne pointer gehen? ist es üblich das new und delete einfach wegzulassen?
-
new, delete, Arrays und Überraschung, dass du sie nicht benutzen sollst? Ich fürchte, du hast nicht C++ gelernt, sondern eine Art C/Java-Mischling. Guck mal die Bücherliste in meiner Signatur an, für vernünftige Lehrbücher. Vergiss den Unsinn den du gelernt hast und nenn uns noch, wo du C++ gelernt hast, als abschreckendes Beispiel. Galileo-Verlag? Jürgen Wolf?
Die Antwort auf dein Problem wäre:
1. Ja, benutze kein new, delete oder Arrays ohne extrem guten Grund.
2. Wenn du meinst, einen extrem guten Grund gefunden zu haben: Er ist nicht gut.
3. Nimm std::vectorLeider wirst du vermutlich mit deinem bisherigen Wissen keine Ahnung haben, was std::vector ist und dir wird sicherlich auch der Hintergrund fehlen, um std::vector auf die Schnelle zu verstehen. Da kann ich dir leider auch nicht helfen, da musst du eben erst richtiges C++ lernen.
-
Könnte auch noch für dich interessant sein:
http://www.cplusplus.com/reference/std/new/set_new_handler/MfG
Edit: Es ist natürlich richtig auf new und delete zu verzichten, wie schon des öftern hier gesagt wurde.
-
die arroganz hier ist wohl noch größer als im php forum. in dem thread wo ich nach verbesserungsvorschlägen für meinen voll funktionsfähigen chat server und client gefragt hab, hat aber keiner geantwortet.
da hab ich auch einfach pointer arrays benutzt und solche dinge die man wohl auf keinen fall benutzen sollte obwohl die sprache sie anbietet.
-
Das hat nichts mit Arroganz zu tun, sondern mit der Tatsache, dass du es nicht wahrhaben willst, Unsinn gelernt zu haben. Die Leute hier haben jahrelange Erfahrung und wissen, wovon sie sprechen. Es liegt an dir, deren Hilfe anzunehmen, oder nicht.
Und dein Code zeugt eindeutig von schlechtem bzw. falschen Design.
-
Naja, irgendwie wird hier schon immer eine gewisse Arroganz zur Schau gestellt - selbst wenn die Leute natürlich recht haben. (Das typische "Wir kennen uns aus, du hast keine Ahnung")
Dein Problem, Nikolai, ist glaube ich, dass dir vielleicht nicht ganz klar ist warum dein Programm crasht. Das ist nicht ein kleinerer Fehler, das ist ein katastrophaler Fehler bei dem dein Betriebssystem aus Sicherheitsgründen die Reißleine zieht. Es kann dir in so einer Situation auch passieren, dass du auf Speicher zugreifst der dir gehört, dann merkt das Betriebssystem nichts, das Programm crasht nicht, und du überschreibst eventuell für dich wichtige Daten, die dann unwiederbringlich verloren sein können. Deine Fehlerlösungsversuche gehen also am eigentlichen Problem etwas vorbei.
Man kann durchaus riesiege Mengen von Code schreiben, um das selbst irgendwie zu behandeln (bevor das Betriebssystem eingreift). Sinn macht das aber keinen. Die richtige und vernünftige Lösung ist einfach, solche Situationen zu vermeiden. Und das macht man am besten, indem man new/delete vermeidet.
-
Nikolai schrieb:
die arroganz hier ist wohl noch größer als im php forum.
Na das hoffe ich doch, wir haben allen Grund dazu. MUAHAHAHHAA! .. Ehem..
Nikolai schrieb:
in dem thread wo ich nach verbesserungsvorschlägen für meinen voll funktionsfähigen chat server und client gefragt hab, hat aber keiner geantwortet.
Dazu hätte man ja auch nur schreiben können: Guck dir C++ noch mal an. Ich meine, da kann man nicht mehr verbessern, da hilft nur noch neu schreiben. So ist das halt als Anfänger. Aber wenn man sich nicht mal die Mühe macht alles einheitlich einzurücken, braucht man auch auf keine Antwort zu hoffen.
Nikolai schrieb:
da hab ich auch einfach pointer arrays benutzt und solche dinge
Ja, der war ja auch totaler Müll!
Nikolai schrieb:
die man wohl auf keinen fall benutzen sollte obwohl die sprache sie anbietet.
Die soll man benutzen wenn man 1. muss und 2. weiß was man tut. Da du keine Standardbibliothek nachbauen musst, ist 1. nicht erfüllt. Und 2. na ja, die Antwort kennst du wohl. Wenn du aus Neugier lernen willst, dann bau sowas wie std::vector, std::list etc. nach. Guck dir das Interface und die Anforderungen genau an, und bau es exakt nach. Wenn du dann hier fragst wie die Implementierung ist, bekommst du auch ne Antwort. (Sofern du ordentlich einrückst.)
Aber in einem anderen Kontext macht es keinen Sinn sich mit rohen Zeigern rumzuschlagen, weil die Antwort auf die Frage "Was mache ich denn wenn ich keinen std::vector habe?" "Selber bauen!" lautet.
-
Nikolai schrieb:
da hab ich auch einfach pointer arrays benutzt und solche dinge die man wohl auf keinen fall benutzen sollte obwohl die sprache sie anbietet.
Diese Denkweise ist ausgesprochen gefährlich. Viele Sprachen bieten beispielsweise goto an; trotzdem ist es in den allermeisten Fällen eine sehr schlechte Idee, darauf zurückzugreifen. Eine gute Programmiersprache hält dir nicht bei allem die Hand -- nur, dass man etwas auf eine bestimmte Weise schreiben kann, heißt nicht, dass es eine gute Idee ist, es so zu tun. Man kann Basisklassen ohne virtuellen Destruktor schreiben, aber wenn man weiß, was man tut, lässt man es tunlichst bleiben. Man kann mit dynamic_cast den konkreten Typ hinter einer Basisklassenreferenz heraussuchen, aber wenn man weiß, was man tut, lässt man es tunlichst bleiben (sofern man nicht gerade einen Fünf-Minuten-Fix zusammenschustern muss und das Problem später richtig löst).
Bei Zeigern ist es insofern etwas komplizierter, als dass (auch wenn es in der überwiegenden Mehrzahl der Fälle besser ohne geht) es durchaus eine nicht vernachlässigbare Menge von Umständen gibt, in denen Zeiger eine gute Lösung sind (auch rohe, dann aber natürlich nicht besitzend). Vorsicht ist aber mit Zeigern in jedem Fall geboten.
-
Nikolai schrieb:
die arroganz hier ist wohl noch größer als im php forum.
Damit magst du grundsätzlich Recht haben, aber gerade in diesem Thread sehe ich nicht viel was ich als arrogant bezeichnen würde. (Zumindest nicht vor deinem hier zitierten Beitrag. EDIT: OK, auch danach gibt es eigentlich nur ein wirklich unnötiges Kommentar /EDIT)
Wenn hier also nicht gerade mächtig viel böse Kommentare gelöscht wurden, bist du wohl einfach etwas zu empfindlich.in dem thread wo ich nach verbesserungsvorschlägen für meinen voll funktionsfähigen chat server und client gefragt hab, hat aber keiner geantwortet.
Ich hab' mir den Thread kurz angesehen. Könnte vermutlich daran liegen dass der Code grauenhaft ist, und noch dazu reichlich unübersichtlich eingerückt.
Kaum jemand hat Lust sowas zu lesen, und kaum jemand hat Lust dir 10 oder mehr Stellen aufzuzählen wo du Mist baust.
Noch dazu weil es mit einem einfachen "das ist Mist" ja nicht getan ist - damit es dir hilft müsste man an jeder Stelle genau erklären warum das Mist ist, und vor allem wie man es besser macht. Was u.U. nicht so trivial ist, und alles andere als trivial zu erklären.da hab ich auch einfach pointer arrays benutzt und solche dinge die man wohl auf keinen fall benutzen sollte obwohl die sprache sie anbietet.
Dass keiner geantwortet hat heisst ja nicht dass der Code gut ist.
Der Code ist nicht gut, er ist grauenhaft.----
Nikolai schrieb:
es ist nur ein schnelles beispiel aber ich will das programm nicht crashen lassen wenn auf ein nicht existierendes objekt zugegriffen wird. geht das nicht irgendwie?
Wie schon erwähnt wurde geht das in C++ nicht, und die einzige Lösung ist zu vermeiden dass dein Programm solche Zugriffe macht.
Wenn du eine Sprache willst die mit sowas klarkommt, dann verwende C# oder Java. Da ist dank Garbage-Collection garantiert dass alle Objekte auf die dein Programm überhaupt noch zugreifen kann auch noch da sind.
-
mein code ist also grauenhaft, totaler schrott, der letzte müll, obwohl er vollständig funktioniert. wie wärs dann mit ein par beispielen was daran genau schlecht ist, auf jeden fall anders gemacht werden sollte und warum?
einrücken hab ich gemacht, keine ahnung wie man es noch besser machen sollte.
-
Jemand, der mit Code wie
string* str=new string("asdf");aufwartet und Einrücken für das entscheidende Kriterium der Codequalität hält, dessen Code kann nur totaler Schrott sein (so sinnvoll Einrückung auch ist).
Das ist aber auch nicht so richtig schlimm -- immerhin bist du ganz offensichtlich Anfänger. Nur solltest du dich nicht auf imaginären Lorbeeren ausruhen, weil du irgendwas zusammengeschustert hat, was für den Moment einigermaßen hält. Bei dem, was ich bisher von dir gesehen habe, gehe ich beispielsweise jede Wette ein, dass dein Code Speicher leckt wie ein Küchensieb.
-
Verlink mal bitte deinen anderen Thread, bin zu faul zum suchen.
-
Kellerautomat schrieb:
Verlink mal bitte deinen anderen Thread, bin zu faul zum suchen.
Alle Beiträge von Nikolai anzeigen, FTW! Er meinst diesen Thread:
http://www.c-plusplus.net/forum/305611500 Zeilen Code mit der Aufforderung "Ich habe zwar keine Frage, aber schaut trotzdem mal durch, ihr habt schließlich sonst nix zu tun". Kein Wunder, dass dort niemand geantwortet hat. Zu den Winapizeugs kann ich nix sagen, außer dass ich mir da einen Wrapper machen würde, anstatt so wild am C-Interface rumzufummeln, der Rest des Codes ist so typischer "C++ von A bis Z"-Stil (das ist kein Kompliment), wenn ich mal raten darf, wer hier der Lehrer war.
P.S.: Oh Gott:
cin.sync(); cin.clear();//keine ahnung wozu, im buch wurde das immer so gemacht.Das macht glaube ich nicht einmal Jürgen Würgen. Hoffe ich.
@Nikolai: Dir will hier niemand was böses. Im Gegenteil, du willst Hilfe, wir wollen helfen. Dazu muss man aber auch sagen können, dass dein Code Mist ist und dass dies daran liegt, dass du Mist gelernt hast (nochmals bestätigt durch dieses grandiose Fundstück aus deinem Buch). Wie sonst solltest du erfahren, dass du umlernen musst, wenn du jemals weiter kommen möchtest?
-
Nikolai schrieb:
das programm crasht einfach immer.
kann man das irgendwie lösen?Zusätzlich zu dem, was die anderen eh schon geschrieben haben...
Das muss nicht crashen. Das ist undefiniertes Verhalten. Es gibt keinen Fehler "auf ein nicht existierendes Objekt zugreifen". Es könnte zu einer access violation kommen. Muss es aber überhaupt nicht. Solche Fehler können jahrelang unbemerkt im Code bleiben. Solche Speicherfehler sind ganz übel. Das schlimmste was passieren kann, es wird irgendwo im Programm Speicher überschrieben, was später an einer ganz anderen Stelle zu einem Crash führt (oder einfach dazu, dass sich das Programm falsch verhält, was aber gar nicht auffällt). Nach solchen Fehlern kann man wochenlang suchen.
-
SeppJ schrieb:
Kellerautomat schrieb:
Verlink mal bitte deinen anderen Thread, bin zu faul zum suchen.
Alle Beiträge von Nikolai anzeigen, FTW! Er meinst diesen Thread:
http://www.c-plusplus.net/forum/305611500 Zeilen Code mit der Aufforderung "Ich habe zwar keine Frage, aber schaut trotzdem mal durch, ihr habt schließlich sonst nix zu tun". Kein Wunder, dass dort niemand geantwortet hat. Zu den Winapizeugs kann ich nix sagen, außer dass ich mir da einen Wrapper machen würde, anstatt so wild am C-Interface rumzufummeln, der Rest des Codes ist so typischer "C++ von A bis Z"-Stil (das ist kein Kompliment), wenn ich mal raten darf, wer hier der Lehrer war.
P.S.: Oh Gott:
cin.sync(); cin.clear();//keine ahnung wozu, im buch wurde das immer so gemacht.Das macht glaube ich nicht einmal Jürgen Würgen. Hoffe ich.
@Nikolai: Dir will hier niemand was böses. Im Gegenteil, du willst Hilfe, wir wollen helfen. Dazu muss man aber auch sagen können, dass dein Code Mist ist und dass dies daran liegt, dass du Mist gelernt hast (nochmals bestätigt durch dieses grandiose Fundstück aus deinem Buch). Wie sonst solltest du erfahren, dass du umlernen musst, wenn du jemals weiter kommen möchtest?
Ich keine Ahnung was cin.sync und clear bewirkt, aber ich konnte herausfinden, um welches Buch es sich handelt:
C++ – Lernen und professionell anwenden(Hab ich bei Google gefunden und da war gleich das ganze Buch bei Google Books. Ist das überhaupt legal, dass Google Books ein ganzes Buch hat?)
EDIT: War nur eine Leseprobe. Hier der Link zum Buch;
http://books.google.at/books?id=yNlxgQAaXBcC&pg=PA587&lpg=PA587&dq=cin.sync();++++cin.clear();&source=bl&ots=DN9YWrvPFZ&sig=z0q9xN7BbSS3zB58cw3rcz3z4SA&hl=de&sa=X&ei=newKUOacDKPC0QWf1_DeCg&ved=0CIIBEOgBMAg#v=onepage&q=cin.sync()%3B cin.clear()%3B&f=false
-
@TE: Guck mal in deinen Thread. Ich glaub, ich hab dort einen Post verloren.
-
das ist der korrekte buchtitel. der name war wohl nicht programm, die bewertungen bei amazon waren jedenfalls gut, nur danach hab ichs ausgesucht.