Dwa nawiasy
Jak to zwykle bywa, trzeba było zrobić drobne usprawnienie. No, nic prostszego... Akurat! Trzeba najpierw zmienić, żeby bebechy umiały kojarzyć po więcej, niż jednym polu. Z wielkim obrzydzeniem się do tego zabrałem, bo to hektary kodu dawno przeznaczonego do wyrżnięcia w pień...
Zamiast dotychczasowego char* zrobiłem szybciutko stl-owe vector<string> i pięknie. Tysiąc funkcji i półtora makr do łatwej poprawki i już po dwóch godzinach znowu kod się kompiluje. Sukces! Ale mierny. Wywala się...
Wywala się kretyńsko. Segfaultem w destruktorze, który niczego istotnego nie robi. Znaczy, że pewnie gdzieś coś wali rykoszetami po okolicy... Tylko gdzie? To złożona struktura, dynamiczna, debuggować się tego nie chce, bo mózg się przy analizie lasuje... No, to wkompilowujemy system obronny. Ale moduł skanerów i tarcz przeciwko wojnom rdzeniowym żadnych dywersji ani sabotaży nie wykrył... No, niby dobrze i tego należało się spodziewać, bo kod przestrzelany w boju jest, ale co jest, do cholery? Gdzieś przy tych hurtowych poprawkach coś zepsułem?
Trzeciego dnia znalazłem. Nie, żebym tyle nad tym siedział. Nie, w tym czasie zdążyłem pół kraju przejechać i jeszcze całe stado słoni opić. Tyle czasu jakoś tak po prostu minęło... Jak to zwykle, najskuteczniejsze okazało się podejście dummy-coder, czyli binarne wykomentowywanie kodu, który nie działa. Konsekwentnie wywala się zawsze w jednym delete. Bydlę. Tyle lat działało grzecznie, a teraz tak mi robi? Czego chcesz, gadzie?
Dobrze ukryte w makrze delete nie rzucało się w oczy. Usuwany obiekt był tablicą. Tworzony przez new typ[ileśtam]... Któreśtam gcc (bodajże 2.95 – ono miało masę fajnych ficzerów) umiało samo rozpoznać, jak należy usuwać przydzieloną pamięć i nie wymagało specyfikowania operatora tablicowego. 3.x już nie... Pamięć pewnie się nie zwalniała cała, ale to miało żadne znaczenie, bo procesy i tak pojawiają się tam na chwilę i znikają, więc wycieki były nierejestrowalne. Dopiero użycie złożonych obiektów zamiast dotychczasowych zwykłych char* spowodowało problemy przy wywołaniach destruktorów. Szlag by to. Dwa nawiasy. Dwa nawiasy... delete [] obiekt i działa. Dwa głupie nawiasy. Jak ja nie cierpię komputerów...
10 komentarzy | Nie lubię komputerów Ogólne Powrót do przeszłości Techblog | Permalink