( geza42 | 2021. 03. 26., p – 21:18 )

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).