Как уничтожить одноэлементный экземпляр или почему следующий код работает для деструктора? - PullRequest
1 голос
/ 10 октября 2019

следующий код, используемый для удаления экземпляра-одиночки, зачем нужны работы перед удалением?

// @brief Destruct the singleton instance
// @note Only work with gcc/clang
__attribute__((destructor)) static void delete_() {
    //works before delete
    typedef char T_must_be_complete[sizeof(T) == 0 ? -1 : 1];
    (void) sizeof(T_must_be_complete);
    delete instance_;
}

1 Ответ

1 голос
/ 10 октября 2019

Это удаление, которое сначала проверяет, завершен ли тип. Аналогично boost::checked_delete.

Идея состоит в том, чтобы сгенерировать ошибку компиляции при попытке удалить неполный тип (, который имеет хорошие шансывызывая неопределенное поведение, в зависимости от типа ).

Например (для удобства используется boost::checked_delete, поскольку я не знаю специфику класса, членом которого является ваш delete_, но они в основном одинаковы):

struct X;

void foo(X* x) {
    boost::checked_delete(x);
}

Обратите внимание, что обычный delete x; может вызывать предупреждение от компилятора (в зависимости от вашего компилятора), но это не гарантируется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...