Как уничтожить объект, созданный в main () после SIGSEGV

Я хотел бы знать, есть ли какой-нибудь тривиальный способ уничтожения объекта, который был создан в 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 просто освободите его (чтобы вызвать деструктор), но это потребует дополнительной работы.

А также, это может быть глобальный объект, но я хочу избежать проблемы глобального порядка инициализации …

0

Решение

Вы можете попытаться организовать упорядоченное завершение работы SIGSEGV. Это не без его подводных камней, но начните здесь: Можно ли прекратить только один поток при получении SIGSEGV?

Вы можете попытаться завершить один нарушающий поток в вашем обработчике сигналов и установить глобальный флаг, чтобы сказать: «Мы облажались, пора завершать работу». Затем в главном цикле сообщений проверьте флаг и отключите его, если он установлен.

1

Другие решения


По вопросам рекламы [email protected]