C++/C Debugging im JavaStyle
-
http://www.kharchi.de/cppratgeber3.htm
Nur nen Stacktrace kann man nicht ausgeben. Zumindest ist mir da keine Möglichkeit bekannt. Aber ansonst stehen die Exceptions denen in Java in nichts nach!
-
Geht nicht, da C++ im Normalfall als nativer Code vorliegt und keine VM im Hintergrund
hat welche alles überprüft.Es ist normal, dass man Zeiger auf 0 überprüft bevor man Sie verwendet.
-
ChockoCookie schrieb:
Die Runtime von C++ ist auf schlank optimiert und bietet keine netten Extras, wie Bereichsprüfungen (höchstens indirekt durch schutzverletzungen). Du musst, immer explizit überprüfen, das ist vielleicht lästig, aber was denkst du, wieso C++ schneller ist als java?
Hem, also std::vector u.a. haben Bereichsüberprüfung.
vector<int> v(10); try { v.at(13) = 10; } catch(out_of_range& ex) { cout << ex.what() << endl; }
Kommt nur darauf an, ob man es nutzen will.
-
SirLant schrieb:
Es ist normal, dass man Zeiger auf 0 überprüft bevor man Sie verwendet.
Yo, das mache ich sogar in Java! Auch wenn mir meine Kollegen sagen, das es in Java keine Pointer gibt... aber die nennen sich in Java halt nur "Referenzen".
-
Hem aber std::vector ist, kein nativer Datentyp und die überprüfung findet auch nicht in der Runtime statt, sondern in der std Bibliothek.
-
Ist doch egal ob es in der Library oder in der Runtime stattfindet. Hauptsache es wird gemacht, wenn man es will. Und normale Datentypen... tja, dann macht man halt selber mal eine if-Abfrage rein. In Java ist die if-Abfrage halt in der JVM drin. Vorteil: man spart sich Tip-Arbeit. Aber mehr auch nicht.
-
Artchi schrieb:
Ist doch egal ob es in der Library oder in der Runtime stattfindet. Hauptsache es wird gemacht, wenn man es will. Und normale Datentypen... tja, dann macht man halt selber mal eine if-Abfrage rein. In Java ist die if-Abfrage halt in der JVM drin. Vorteil: man spart sich Tip-Arbeit. Aber mehr auch nicht.
Darauf wollt ich hinaus.
-
tomte schrieb:
Vermisst habe ich natürlich die überragenden Möglichkeit der Exceptions. Vor allem die NullPointerException
java. ich vermisse keine NullPointerExceptions.
lern c++, dann fliegen auch keine schutzverletzungen/coredumps mehr.
nimm nie eingebaute arrays, sondern nur container mit indexgrenzenüberprüfung (im debug-mode, versteht sich). lass nie nen pointer uninitialisiert entstehen, sondern weise ihm sofort nen sinnvollen wert zu. geht das noch nicht, lass den pointer erst entstehen, wenn der wert gut zuweisbar ist. und benutze keine pointer-arithmetik. und schon kann dir kein fehler mehr passieren.Ehrlich gesagt will ich keine Exceptions, aber ich möchte wenigstens die Codezeile genannt bekommen in der ein Nullpointer vorliegt.
na, das ist das allerkleinste problemchen! ich benutzte jahrelang den msvc60. da startet man sein programm mit F5 drin, worauf es so gestartet wird, daß der debugger mitläuft, und wenn ein zugriff auf 0 passiert, wirft einen der debugger in der ide auf die code-zeile, wo der fehler war. dann muß man normalerweise noch finden, wer diese funktion aufgrufen hat und bei welchen lokalen variablen in welcher aufrufenden funktion wa sschief ging. drücke alt+7 und du kannst den call-stack hoch und runterlaufen und dabei immer alle variableninhalte sehen, bis hoch zu main.
schutzverletungsfehler in sachen indexgrenzen, nichtinitialisieren und so hat man damit in wenigen sekunden. regelmäßig.
-
Artchi schrieb:
SirLant schrieb:
Es ist normal, dass man Zeiger auf 0 überprüft bevor man Sie verwendet.
Yo, das mache ich sogar in Java!
jo. in java sollste das machen.
in c++ sollste so schreiben, daß du es nie machen mußt und auch nie machen.
new wirft ne exception, wenn es shiefgeht!
der compiler warnt bei uninitialisierten lokalen variablen.
global liegen singletons rum.
man baut keine nicht inhaltlich begründeten (dumm nullsetzende) standardkonstruktoren.
wie um alles in der welt kommt ihr an nullpointer?
-
volkard schrieb:
Artchi schrieb:
SirLant schrieb:
Es ist normal, dass man Zeiger auf 0 überprüft bevor man Sie verwendet.
Yo, das mache ich sogar in Java!
jo. in java sollste das machen.
in c++ sollste so schreiben, daß du es nie machen mußt und auch nie machen.
new wirft ne exception, wenn es shiefgeht!
der compiler warnt bei uninitialisierten lokalen variablen.
global liegen singletons rum.
man baut keine nicht inhaltlich begründeten (dumm nullsetzende) standardkonstruktoren.
wie um alles in der welt kommt ihr an nullpointer?int *p = new(nothrow) int(1);