2011-09-23 17 views
5

Mam dylib, który mogę załadować poprzez wtrysk na Mac OS X. Wywołanie konstruktora działa dobrze.dylib destructor nie nazywa się

__attribute__((constructor)) 
static void initialize() 

Ale destruktor nie zostaje wywołany? W ten sposób zainicjowano wycieki zasobów.

__attribute__((destructor)) 
static void destroy() 
  1. Czy dylib zostaje rozładowane automatycznie, jeśli program zostanie zamknięty?
  2. Czy wstrzyknięta dylib zostanie automatycznie rozładowana po zamknięciu aplikacji?
  3. Jak możemy wyładować dylib z aplikacji w czasie wykonywania? Jako kod zastrzyku mogę uzyskać dostęp do prywatnego obszaru. Czy jest jakieś polecenie, aby to zrobić?
+0

Pytanie Ciąg dalszy http://stackoverflow.com/q/7553355/802921 – MacGeek

Odpowiedz

4

1, 2: Nie. Biblioteki nie są tak naprawdę rozładowywane po wyjściu aplikacji - po prostu znikają wraz z resztą procesu, w taki sam sposób jak inne zasoby (np. Uchwyty plików, zmapowana pamięć, gniazda, itp.) są wydawane przy wyjściu.

3: Zależy od sposobu wstrzyknięcia biblioteki. Jeśli załadowałeś go przy użyciu czegoś takiego jak dlopen(), powinieneś być w stanie zwolnić bibliotekę przy użyciu na przykład dlclose(); NSBundle ma coś podobnego.

Należy pamiętać, że wyładowywanie bibliotek jest nieczytelne. W szczególności nie jest bezpieczne wyładowywanie biblioteki zawierającej dowolne klasy ObjC, ponieważ środowisko wykonawcze może przechowywać w pamięci podręcznej odniesienia do twoich klas.