Új hozzászólás Aktív témák
-
EQMontoya
veterán
Én is azon gondolkodtam este (némi privát üzenetetek váltását követően), hogy hogyan lehetne ezt kivédeni. Mert ha ctorbab b@ssza el az ember az init sorrendet, arra ugye van warning, egyértelmű user error.
Ezt viszont már nem veszi észre a fordító, mert az a-t inicializálni próbáló fv. dependál b-n.
Tehát warning nem lesz, viszont irgalmatlan szívás igen.Ugye először lehetne még jönni azzal, hogy ctorból nem hívogatunk tagfüggvenyeket, de nem virtuálisakat nyugodtan lehet.
Talán a legnagyobb probléma itt az, hogy a ctor valami olyat próbál csinálni, ami nem teljesen feladata, de ez megint megfoghatatlan.
-
dobragab
addikt
Így van.
Amikor a count_a hívódik, a b adattag még nincs inicializálva, így nettó undefined behaviour.Nálam természetesen a saját allokátortól valamiért (debug mód, vagy OS security, vagy direkt kiszúrásból) kinullázott memóriaterületet kaptam, ami véletlenül az adott implementációban az üres vektor memóriaképével egyezett (count == 0, capacity == 0, data == nullptr)... Ezen frankón lefutott a push_back. Otthon egyébként debug módban crash, release-ben fut.
Az első megoldást választottam, mert a prod kódban ott nem egy sima int van, hanem egy bonyolult, connection állapotot kezelő cucc, rengeteg adattaggal, az egyik konstruktorparaméterére hívtam egy count_a-szerűséget. És még a vektor is csak metaadat, így a tagfüggvényben csak lestem, miért romlik el minden, és a hitem szerint jól inicializált, sehol máshol nem módosított vektorra csak egy nap debugprintf után gondoltam.
Majd beletúrok az allokációba, hogy debug módban írja felül random adattal a memóriaterületet.
Amúgy meg szerintem kéne kérnünk egy SPOILER taget a topikba

-
Hiftu
senior tag
Közben kipróbáltam. Segmentation fault-ot írt ki.

A b.push_back(i)-re hasalt el.
Akkor ötletem nem volt rossz, csak az eredménye: az a inicializálásakor még nincsen b vectorod.Megoldás #1:
Felcseréled az a és b változó sorrendjét.
Ez egy elég gyenge megoldás, több változó esetén szívhatsz vele.Megoldás #2:
Az összefüggő adatok inicializálását kiveszed az inicializálási listából (de szarul hangzik magyarul)
és berakod a constructor függvénytörzsébe.
Új hozzászólás Aktív témák
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- Xbox 360 Kronos 500GB RGH3 - Dobozos gyűjtői állapotú
- i7 12700/ 32GB DDR4/ RTX3070Ti/ 1TB SSD alapú konfig/ garancia/ ingyen foxpost
- Thinkpad X1 Extreme Gen 5, 4K+ IPS érintő , i7-12700H ,RTX 3060 , 64GB DDR5, 2TB NVMe, Magyar gar
- iPhone 13 128GB gyári független gyönyörű állapotú IOS 18
- Kingston FURY 32GB (2x16GB) DDR4 3200MHz CL16 KIT Beast Black - 1 év bolti garival! -
- Samsung Galaxy A33 5G / 6/128GB / Kártyafüggetlen / 12Hó Garancia /
- GYÖNYÖRŰ iPhone 13 128GB Midnight - 1 ÉV GARANCIA -Kártyafüggetlen, MS4250, 100% Akksi
- Telefon felváráslás!! Samsung Galaxy S22/Samsung Galaxy S22+/Samsung Galaxy S22 Ultra
- HP Zbook Studio G8 WorkStation i7-11850H 32GB 512GB Nvidia Quadro T1200 400NIT, 100% sRGB Garis!
- Bomba ár! Dell Latitude E5440 - i5-4GEN I 4GB I 320GB I 14" I HDMI I Cam I W10 I Gari!
Állásajánlatok
Cég: BroadBit Hungary Kft.
Város: Budakeszi
Cég: ATW Internet Kft.
Város: Budapest
Amikor a count_a hívódik, a b adattag még nincs inicializálva, így nettó undefined behaviour.

