- Android alkalmazások - szoftver kibeszélő topik
- A Pixel 10 minden színben és oldalról
- Poco X6 Pro - ötös alá
- Stílussal és friss szenzorokkal futott be a Huawei Watch GT 5
- Samsung Galaxy S23 Ultra - non plus ultra
- Milyen okostelefont vegyek?
- Youtube Android alkalmazás alternatívák reklámszűréssel / videók letöltése
- Samsung Galaxy Watch7 - kötelező kör
- Samsung Galaxy Z Fold7 - ezt vártuk, de…
- Samsung Galaxy A56 - megbízható középszerűség
Ú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!
- Panasonic CF-XZ6 AIO all-in-one laptop tablet 2k touch i5-7300u speciális ütésálló rugged
- Szép állapotban levő Apple iPhone 15 256GB / 12 hó jótállás
- Geforce GTX 1050, 1050 Ti, 1060, 1650, 1660 - GT 1030 - Low profile is (LP)
- REFURBISHED és ÚJ - Lenovo ThinkPad 40AS USB-C docking station (akár 3x4K felbontás)
- Samsung Galaxy S25 128GB Kártyafüggetlen 1 év Garanciával
Állásajánlatok
Cég: FOTC
Város: Budapest