[DLL] Co tak naprawdę można bezpiecznie eksportować?
Ostatnio zmodyfikowano 2017-09-11 20:13
golibroda13 Temat założony przez niniejszego użytkownika |
[DLL] Co tak naprawdę można bezpiecznie eksportować? » 2017-09-11 18:17:38 Dzień dobry, chciałbym się zapytać o następującą kwestię tego co może być w interfejsie DLLki a co być nie powinno. Chciałbym móc wystawić np. zmienną tekstową: Jednakże, jak dobrze rozumiem, inny kompilator może zastosować inny alignement klasy albo inną kolejność pól, jeżeli std::is_trivial < std::string >::value == 0 . (1.) Czy zatem poprawne będzie zrobienie: const char * GetString() { static const char * str = "Content"; return str; }
? (2.) Czy to niesie za sobą jakieś dodatkowe zagrożenia? Tutaj myślę o zwalnianiu pamięci. Czy standard daje mi jakieś gwarancje, co do czasu życia zmiennej z DLLki? Chciałbym również zweryfikować swoją wiedzę: (3.) Jeżeli klasa jest typem trywialnym to można ją bezpiecznie zwrócić z DLLki, jeżeli alignement się zgadza. Aczkolwiek to również generuje moje kolejne pytanie: (4.) Czy rodzaj kompilatora ma wpływ na alignement czy jest to zależne od platformy i np. Clang i GCC muszą na tym samym 32bitowym Windowsie wypluć klasy z tym samym alignementem? Bonus: (B.) Ktoś może polecić jakieś dobre materiały (najlepiej polski ale angielskie też ok) na temat interfejsu binarnego C++a oraz tego jak poprawnie przygotować interfejs DLL, na jakie zagrożenia uważać, jak obsługiwać pamięć za pomocą własnych funkcji? |
|
Kinexity |
» 2017-09-11 18:50:32 Skoro jest to wskaźnik, to pamięć nie zostanie zwolniona automatycznie - chyba przespałeś fragment, gdy czytałeś o wskaźnikach... |
|
golibroda13 Temat założony przez niniejszego użytkownika |
» 2017-09-11 19:06:41 @Kinexity, nawet nie wiem czy chce mi się ci odpisywać, ale niech stracę: Tutaj jest wskaźnik, owszem ale na zmienną, która będzie trzymana w pamięci statycznej DLLki (a dodatkowo do literału, który i tak by tam się znalazł bez słowa static ). Nie trzeba jej zwalniać ani alokować gdyż pamięć statyczna leży w gestii systemu operacyjnego. Wskaźnik będzie tak długo ważny jak w pamięci będzie ta DLLka. Pytanie polega na tym, czy system gwarantuje mi, że DLLkę zwolni (a zarazem statyczną pamięć DLLki) zawsze po zamknięciu mojego programu, który z niej korzysta. Czy istnieje ryzyko, że z jakiegoś powodu system zdecyduje zmienić miejsce DLLki w pamięci (nie wiem, zrzuci ją do pamięci wirtualnej a potem wrzuci w inne miejsce) albo uzna za nieużywaną i zwolni ją przed końcem życia mojej aplikacji. Czyli dokładniej mówiąc czy istnieje ryzyko, że pobrany z DLLki adres straci swoją ważność i zacznę posługiwać się nieważnym wskaźnikiem. Szczerze powiem, że spodziewałem się trochę bardziej rzeczowych odpowiedzi. |
|
Luq |
» 2017-09-11 19:31:43 Wskaźnik będzie poprawny dopóki dll jest załadowane do pamięci procesu. Czyli do zakończenia procesu lub do zwolnienia dll przez FreeLibrary |
|
j23 |
» 2017-09-11 20:13:20 2) Jeśli dołączasz bibliotekę przez LoadLibrary, może być problem ze zwalnianiem pamięci - biblioteka i aplikacja może korzystać z różnych stert lub różnych bibliotek standardowych. |
|
« 1 » |