Istnieją różne sposoby kończenia procesu:różne sposoby kończenia procesu C++
np .: ExitProcess, ExitThread (z głównym gwintem), wyjścia, przerwanie, powrót z głównym wypowiedzieć.
Chciałbym poznać wpływ każdej z metod na statyczne/globalne/automatyczne niszczenie obiektów.
Na przykład mam projekt, który zawiesza się (prawdopodobnie z powodu jakiegoś błędu dealokacji) podczas wywoływania ExitProcess, ale nie po wywołaniu metody exit(). (związane z this question, nawiasem mówiąc).
W zasadzie chciałbym wiedzieć, w jakich okolicznościach następuje deallokacja powyższych obiektów iw jakiej kolejności (dla VC++).
Właściwie ExitProcess powoduje wywołanie atexit zarejestrowanej. globalne destruktory, jeśli są zdefiniowane w DLL. Zależy to od kolejności wywołań do DLLMain (proces odrywania). Wydaje się, że ExitProcess najpierw odłączy DLL, a potem spróbuje oczyścić własne atexity, a exit() zrobi coś odwrotnego. Tak więc, jeśli zadeklarujesz statykę, która opiera się na jakiejś zewnętrznej bibliotece DLL, mogą nie ulec zniszczeniu przez ExitProcess. (Jest to oparte na niektórych eksperymentach, które dziś zrobiłem.) –
Interesujące, że inne biblioteki DLL wydają się wywoływać swoje destruktory, gdy otrzymują DLL_PROCESS_DETACH.Dokumenty dla ExitProcess() nie mówią, w jakiej kolejności są wywoływane punkty wejściowe bibliotek DLL, ale nawet jeśli są one wywoływane w kolejności LIFO, myślę, że problemy mogą nadal występować, jeśli obiekty globalne w różnych bibliotekach DLL odnoszą się do siebie. –
Calling dtors z DLL_PROCESS_DETACH ma sens, jeśli zauważysz, że dzwonią do ctors z biblioteki DLL_PROCESS_ATTACH. Ale to naprawdę zależy od kompilatora, który utworzył bibliotekę DLL i dzwoniącego, aby to zaaranżować. Spójrz na leniwy ładowanie DLL, aby zobaczyć inną możliwą ścieżkę implementacji. – MSalters