Przyczyny problemów z STL

Na kanale #warsztat krajek męczył mnie abym spróbował jeszcze raz z tym STL-em i dał kilka rad. Jedną z rad było używanie Interfejsów i wyeksportowanie z DLL-a tylko jednej funkcji tworzącej interfejs główny. Zrobiłem tak.

Ale to nie to 😉

Pobadałem trochę przyczyny takiego stanu rzeczy i okazało się, że błędy wyskakują kiedy jakaś funkcja jako parametr pobiera np.: std::string. Po zamianie typu parametru na char* i późniejszym (w środku funkcji) stworzeniu std::string wszelkie problemy znikły.

std::map też nie ma problemów z działaniem. Teraz pozostało mi już tylko dokończyć tworzenie interfejsów – trochę roboty przy tym będzie, ale przynajmniej nikt mi później nie powie, że jest nie-obiektowo 😉

No to tyle. STL wróciło do AGE więc mogę już spać spokojnie 🙂

Reklamy

STL + DLL = QPA!

Do tej pory AGE było tylko biblioteką statyczną. Zechciałem więc żeby dało się skompilować jako DLL. Dowiedziałem się co trzeba zrobić, wrzuciłem odpowiednie kawałki kodu tam gdzie trzeba. Kompilacja. Linkowanie. Wszystko poszło OK. Mam age.dll oraz age.lib więc zabieram się za test.

Tworzę sobie nowy projekcik piszę to co trzeba i uruchamiam. Działa! Pokazało mi się puste czarne okienko – i o to chodziło ^^ Problem pojawił się kiedy stworzyłem klasę dziedziczącą po ageTask. Nagle wyskoczył błąd i program się wywalił.

Skompilowałem sobie więc age_d.dll (debug) i spróbowałem raz jeszcze. Krótka randka z debuggerem i okazało się, że std::string ma jakieś problemy z alokowaniem pamięci. Poszperałem w necie, zapytałem na forum i moje przypuszczenia się potwierdziły: DLL i STL to nie jest dobre połączenie.

Udało mi się jednak znaleźć stronę na której jest sposób na obejście tego problemu. Okazuje się jednak, że możliwe jest to dla std::string oraz std::vector a co z potrzebnym mi std::map? Nic z tego!

Dlatego też postanowiłem napisać własną mini-bibliotekę zawierającą klasy  list, string oraz map. Klasę string właściwie już skończyłem. Interfejs ma prawie identyczny z std::string. Mówię prawie, bo dodałem do niej metodę print( char *format, … ) dzięki której będzie można formatować wygodnie tekst oraz powycinałem te mniej potrzebne metody ^^.

Jeśli chodzi o list to interfejs będzie zupełnie inny niż ten z std::list lub std::vector. Powodem jest nie mniej nie więcej tylko to, że są po prostu brzydkie ^^.