C++ konstruktor es exception kerdes?
Kerdesem ehhez a peldahoz kapcsolodik, van egy osztalyom:
class Bolt
{
Bolt()
{
Elado elado;
Vevo vevo;
...
...
Aru aru;
}
~Bolt()
{
}
}
main()
{
try { Bolt bolt; } catch(exception &e) {};
}
Tegyuk fel az "Aru" osztaly dob egy exceptiont, ekkor az elotte levo osztalyok - Elado, Vevo - destruktorai nem hivodnak meg.
Mi a modja hogy felszabaditsuk az Elado, Vevo, stb. osztalyok altal lefoglalt memoriat?
Ez nem így van. Az Bolt konstruktorában az összes változó felszabadul az aru változó előtt. A main-ben a bolt destruktora nem fog meghívódni, hiszen megszakítottad a létrehozását amikor a konstruktor kivételt dobott.
Lehetséges, hogy terminálódik a program futása mert nem várt típusú kivételt dobtál (amit nem kapsz el), és akkor tényleg az történik amit mondasz.
A vázolt esetben az 1# által írt történik, de vegyük úgy hogy nem local scope, hanem az "elado" és a "vevo" tagváltozók (gondolom így akartad).
Akkor viszont neked kell felszabadítani, szóval ami exceptiont dobhat az "aru" létrehozásánál, azt neked kellene elkapni még a konstruktorban. (tehát azt elkerülni, hogy félig hozz létre egy objektumot, mert ilyen amúgy tényleg van)
# 4/4 Időpont ma 04:37
A kérdező kódjában hol látsz new akármit? Nem mindegy, hogy a stacken, vagy a heapen hozod létre...
Több lehetőség van a memória fel nem szabadítására:
1. Kivételt dob a destruktor, ami terminálja a program futását.
2. Noexcept függvényből dobsz kivételt (terminál).
3. Más típusú kivételt dobsz, mint amit megadtál az függvény exception specification-ben (throw kulcsszó után). Ez az unexcpected handler-t hívja, amit írt más is feljebb.
4. Re-throw-t (throw;) hívsz catch blokkon kívül.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!