mi van, ha "a nyelv" (azaz valami built-in mechanizmus) dob alatta egyet?
Olyan nincs, hogy "csak úgy" dob a nyelv valami exceptiont. Pontosan specifikálva van, hogy mi dobhat exceptiont. OoM esetén maga a new operator dobja, ami szintén specifikálva van.
gyorsabban fognak működni, mint ha mindent elágazásokkal lekezelünk
Igen, de olyan sokat nem számít. Ha nem történik hiba, akkor a hibakezelő if-ek elég jól prediktálható branchek, szóval a különbség minimális. Itt az elvekről beszéltünk, hogy mondjuk a C gyorsabb, mint a C++. És akkor itt volt ez az ellenpélda, hogy nem feltétlenül. Kicsi a különbség, de attól még különbség. Bocsi, nem akartam félrevezető lenni.
felmondanál, ha neked egyesével kellene minden deallokációt és egyéb vacakot megírnod, ahelyett, hogy az exception lekezelné.
Így van, de ezt tényleg erre a konkrét esetre írtam. Tehát ha az lenne a feladatom, hogy olyan kódot írjak, ami le tudja kezelni az OoM-et, de közben meg nem használhatok exceptionokat, akkor mondanék fel.
kivételt bármi dobhat, ami után fel kell minden túrót szabadítani; socket error, file error, whatever error... Vagy C++-ban erre van valami egyéb megoldás is?
Azért nem egészen. A C++ standard library nem sűrűn dobál exceptiont, inkább ott is visszatérési értékekkel operálnak, vagy éppen speckó state-be teszik az objectet hiba után (pl. streamek). De persze azért dobál exceptionokat is, de nem ez a jellemző. Maga a core language meg talán nem dob soha exceptiont, kivétel a new, de ebből ugye van nothrow-s verzió.
Saját magam pedig úgy kezelem a helyzetet, hogy nem használom a standard library-t egyáltalán, hanem mindenre saját megoldásom van, ami mindent hibakóddal kezel le (vagy éppen assert-tel, ha programozó hibáról van szó). Igaziból saját allokátorom is van, szóval a new-t se használom. Egyetlen egy helyen van leírva a kódban az, hogy new (egy placement new, hogy meghívja az ctort, szóval ez se az allokálás miatt van).