2017-02-17 6 views
1

Я использую std :: unique_ptr для управления некоторой памятью. Это работает правильно, когда мой процесс завершается нормально, так как я вижу, как ссылается соответствующий конструктор и деструктор. Однако, когда процесс убит с помощью SIGTERM, я не вижу вызывающего деструктора. Является ли это ожидаемым поведением для std :: unique_ptr, когда процесс завершается с помощью сигнала? Есть ли способ обойти это? Заранее спасибо!Поведение умных указателей, когда процесс убит

+0

Возможный дубликат https://stackoverflow.com/questions/4250013/is-destructor-called-if-sigint-or-sigstp-issued –

+0

Также связанный https://stackoverflow.com/questions/9033931/memory-leak -c/9034141 –

+1

Хотя ответ пользователя268396 верен, вы должны знать, что правильно писать обработчик сигналов очень сложно. Например, запретить доступ к большинству глобальных переменных из обработчика сигналов. Если вы хотите знать, как это сделать правильно, я предлагаю опубликовать новый вопрос. – Brian

ответ

2

Этого следовало ожидать: обработчики сигналов по умолчанию эффективно вызовут exit() в вашем процессе, который завершит процесс. Чтобы обойти это, вы должны установить обработчик сигнала и предпринять соответствующие действия при получении сигнала.

+0

Я использую signal_handler, чтобы поймать сигнал и вызывать exit (0) в пределах того же самого. Не следует ли заставить unique_ptr вызывать деструктор для сохраненного указателя? – wishywashy

+1

@wishywashy: см. [Std :: exit] (http://en.cppreference.com/w/cpp/utility/program/exit), в частности: * «Стек не разматывается: деструкторы переменных с автоматическим [хранилище продолжительность] (http://en.cppreference.com/w/cpp/language/storage_duration) не вызываются. "* – IInspectable

+1

Поведение программы после завершения фатального сигнала ближе к вызову' _exit', чем 'exit '. Он не ** запускает обработчики 'atexit' **. – Brian