Bei den Zeilennummern werden Leerzeilen nicht mitgezählt.
S. 48, Zeile 2: Es muss 12 statt 9 heißen.
Zeile 13: Richtig ist: Die Anweisung c = k << 2 ...
S. 140, Ergänzung: Der G++-Compiler
ignoriert inline, wenn keine Optimierung eingeschaltet ist. Durch
Einschalten der Optimierung wird der Effekt sichtbar, z.B.
g++ -O2 X.cpp main.cpp (Oh-2, nicht Null-2!)
S. 284: Im Text steht richtig, dass zBR mit delete gelöscht werden muss, in den zugehörigen Dateien k7/mehrfach/konflikt/main.cpp und k7/mehrfach/virtual/main.cpp der Beispielprogramme auf der DVD fehlt dies jedoch - bitte nachtragen, auch wenn am Ende von main() der Heap ohnehin freigegeben wird (Programmierstil).
S. 327 unten, Text nach der Zuweisung r01 = U2;: Auch Compiler ändern sich. Aktuelle Compiler nehmen korrekterweise den nächst passenden Operator, nämlich Ober::operator=(const Ober&), weil Ober der statische Typ der linken Seite ist. Das Argument auf der rechten Seite erbt von Ober - das passt auch. Der zu demonstrierende Fehler ist jetzt nur noch durch einen Test zur Laufzeit feststellbar: Dem Objekt U1, auf das die Referenz r01 verweist, wird nur der Oberklassenanteil von U2 zugewiesen, das heißt, U1 und U2 unterscheiden sich nach der Zuweisung!
S. 328, unten. Von den genannten zwei Strategien funktioniert die erste in bestimmten Fällen nicht. Bitte streichen.
S. 475, Zeilen 11 und 12: statt ntonl und ntons muss es ntohl und ntohs heißen.
S. 480, Mitte der Seite: Um einen Pfad zu berücksichtigen, kann der Schrägstrich / in den Funktionsaufruf strchr(...) aufgenommen werden. Dies ist nur ein Workaround; tatsächlich ist es richtig, den Funktionsaufruf gemäß RFC zu belassen und nur die eigentliche Anfrage zu kodieren, also alles nach dem '?' des GET-Protokolls. Dies ist in der geänderten Version von ClientAnfrage.h berücksichtigt.
S. 557, 6. Zeile von unten, Ergänzung: Man könnte meinen, dass beim Werfen einer Exception bei new der Speicher sofort wieder frei wird oder gar nicht erst angelegt wird. Das ist normalerweise der Fall, jedoch nicht festgelegt: "If the new expression terminates by throwing an exception, it may release storage by calling a deallocation function (3.7.4.2)." (Kap. 5.3.4 des Standardentwurfs, Hervorhebung von mir).
S. 560 unten: Es muss swap(temp) statt swap(m) heißen! Bei einer Übergabe per Wert könnte der Operator noch kürzer formuliert werden:
Klasse& Klasse::operator=(Klasse kopie) {
swap(kopie); // wirft keine Exception
return *this;
}
S. 611: Im Abschnitt 24.1.2 heißen die ersten beiden Funktionen richtig strtol und strtoul (Buchstabe t fehlt).
S. 612: Im Programmbeispiel oben ist die Zeile cout << "long-Zahl (10)= ... usw. verrutscht: Sie muss direkt unter der Zeile long lo = ... stehen. In Zeile 6 muss es cin.get(eingabe, sizeof(eingabe)); heißen (statt cin >> eingabe;). Grund: Möglichen Buffer-Overflow vermeiden. Dasselbe gilt für die 2. Zeile von unten auf derselben Seite.
S. 688: Die Werte für Boost sind 2,5 ms (Tabelle 24.2) und 0,6 s (Tabelle 24.3). Die Boost-Werte sind also besser als zuerst angenommen. Der Grund: Um die maximale Performance zu erhalten, muss in den Testprogrammen explizit NDEBUG definiert werden. Bitte #define NDEBUG in addboost.cpp und multboost.cpp nachtragen.