- Czy można w jakikolwiek sposób obsłużyć to wydarzenie?
- Co dzieje się w przypadku rozwijania stosu i deallocation obiektów statycznych/globalnych?
Odpowiedz
EDYCJA: SIGINT, a nie SIGTERM. A Assaf informuje, że żadne obiekty nie zostały zniszczone (przynajmniej w systemie Windows) w przypadku nieobsługiwanego SIGINT.
System wysyła komunikat SIGINT. Ta koncepcja ma zastosowanie (z pewną wariancją) dla wszystkich implementacji C. Aby sobie z tym poradzić, wywołujesz sygnał, określając procedurę obsługi sygnału. Zobacz dokumentację funkcji sygnału pod numerami Open Group i MSDN.
Drugie pytanie jest trochę trudniejsze i może zależeć od implementacji. Najlepiej jest obsłużyć sygnał, który pozwala ręcznie użyć delete
i exit()
.
Dzięki. fyi, strona MSDN, z którą się łączysz, sugeruje, że system wysyła SIGINT (i że NT w górę nie wysyła w ogóle SIGTERM). –
Dzięki, Assaf. Poprawione. –
Ponadto SIGINT, który przekłada się na ExitProcess, nie powoduje zniszczenia żadnego rodzaju obiektu (globalny, lokalny statyczny, automatyczny). Jeśli, otoh, przetłumaczysz sigint na exit(), globals/statics będą destruktorami w odwrotnej kolejności od inicjalizacji (ale automatyki nie). –
Ctrl-C w aplikacji konsoli wygeneruje sygnał. Domyślny moduł obsługi tego sygnału wywołuje ExitProcess w celu zakończenia aplikacji. Można zmienić to zachowanie, ustawiając własne funkcje obsługi dla sygnału za pomocą funkcji SetConsoleCtrlHandler.
+1 za faktyczne udzielenie odpowiedzi na pytanie! –
Co powiesz na deallocation statyki? –
Można sprawdzić, czy stos odwijania występuje z pewnym prostego kodu:
#include <iostream>
#include <windows.h>
using namespace std;
struct A {
~A() { cerr << "unwound" << endl; }
};
int main() {
A a;
while(1) {
Sleep(1000);
}
}
czy nie występuje powinna być zależna od implementacji, w zależności od tego, jak środowisko wykonawcze obsługuje Ctrl-C. Z mojego doświadczenia wynika, że tak się nie dzieje.
Dobry test! Poprawiono mnie. –
Trudno mi zaufać takiemu testowi, ponieważ nigdy nie będę pewien, czy zachowanie będzie się różnić w zależności od konfiguracji projektu (np. Biblioteki, biblioteki dll, natywne, zarządzane, wielowątkowe i ich kombinacje). Więc wolałbym mieć "prawdziwą" odpowiedź i nie polegać na takim teście osobiście. –
Nie ma "prawdziwej" odpowiedzi - Standard C++ nie ma nic do powiedzenia na ten temat, więc to, co dostajesz, zawsze zależy od implementacji. –
- 1. Czym dokładnie kupuje IAP Cracker w aplikacjach?
- 2. Czym dokładnie jest wartość R w C++?
- 3. Czym dokładnie jest kontekst wątku w C#?
- 4. Czym dokładnie jest powiązanie?
- 5. Czym dokładnie jest Gemfire?
- 6. Czym dokładnie jest ContextStaticAttribute?
- 7. Czym dokładnie jest prowizja?
- 8. Czym dokładnie jest DEFAULT_COMPRESSION?
- 9. Czym dokładnie jest cacert.pem?
- 10. Czym dokładnie jest ROM?
- 11. Czym dokładnie jest OData?
- 12. Czym dokładnie jest # ^: _ 1
- 13. Eclipse - Czym dokładnie jest Builder?
- 14. Czym dokładnie jest EV_RECEIPT kqueue?
- 15. Czym dokładnie jest Port Listening
- 16. Czym dokładnie jest n Gram?
- 17. Czym dokładnie jest tekst zmiennoprzecinkowy?
- 18. Czym dokładnie jest atak tęczy?
- 19. Czym dokładnie jest Apache Karaf?
- 20. Czym dokładnie jest "kontener kluczowy"?
- 21. Czym dokładnie jest Zgromadzenie w C# lub .NET?
- 22. Czym dokładnie jest stan użytkownika w ZfcUser?
- 23. Czym dokładnie jest "rola" w Capistrano?
- 24. Czym dokładnie jest obiekt "QuerySet" w Mongoengine?
- 25. Czym dokładnie jest "wyjście" w PowerShell?
- 26. Czym dokładnie jest tensor w theano?
- 27. Czym dokładnie jest wiadro w hashmapie?
- 28. Czym dokładnie jest streambuf? Jak tego używać?
- 29. Skrypt do obiektu JavaScript: czym dokładnie jest {a, b, c}?
- 30. Czym dokładnie jest strona kodowa Unicode 1200?
+1: doskonałe pytanie :) –
Doskonały uchwyt :) –