Я хотел бы знать, есть ли какой-нибудь тривиальный способ уничтожения объекта, который был создан в main()
после того, как приложение просто упало (или было прервано, или каким-либо другим. См. код:
#include <iostream>
#include <signal.h>
#include <stdlib.h>
class TestClass {
public:
TestClass() { std::cerr << "Constructor" << std::endl; }
~TestClass() { std::cerr << "Destructor" << std::endl; }
};
void signal_handler(int signum) {
std::cerr << "Signal caught " << signum << std::endl;
exit(1);
}
int main() {
TestClass a;
struct sigaction new_action, old_action;
new_action.sa_handler = signal_handler;
sigemptyset (&new_action.sa_mask);
new_action.sa_flags = 0;
sigaction (SIGSEGV, NULL, &old_action);
if (old_action.sa_handler != SIG_IGN)
{
sigaction (SIGSEGV, &new_action, NULL);
}
// CRASH !!!
int* p = 0; *p = 0;
}
Итак, я устанавливаю обработчик сигнала, который после выполнения должен выполнить некоторую очистку, а затем просто завершить работу. Очевидно, что это большое приложение, поэтому я хотел бы вызвать деструктор моих классов, которые создали временные файлы (теоретически).
Было бы легко выделить его динамически и в signal_handler
просто освободите его (чтобы вызвать деструктор), но это потребует дополнительной работы.
А также, это может быть глобальный объект, но я хочу избежать проблемы глобального порядка инициализации …
Вы можете попытаться организовать упорядоченное завершение работы SIGSEGV. Это не без его подводных камней, но начните здесь: Можно ли прекратить только один поток при получении SIGSEGV?
Вы можете попытаться завершить один нарушающий поток в вашем обработчике сигналов и установить глобальный флаг, чтобы сказать: «Мы облажались, пора завершать работу». Затем в главном цикле сообщений проверьте флаг и отключите его, если он установлен.