如何析构单例实例,或者为什么以下代码适用于析构函数?

How to destruct a singleton instance, or why the follow code works for destructor?

本文关键字:为什么 代码 适用于 析构函数 或者 何析构 析构 实例 单例      更新时间:2023-10-16

以下代码用于删除单例实例,为什么删除前的工作是必要的?

// @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_;
}

这是一个删除,首先检查类型是否完整。类似于boost::checked_delete.

它的想法是在尝试删除不完整的类型时生成编译错误(这很有可能导致未定义的行为,具体取决于类型(。

例如(为方便起见,使用boost::checked_delete,因为我不知道您的delete_所属类的具体情况,但它们基本上是相同的(:

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

请注意,常规delete x;可能会导致编译器发出警告(具体取决于编译器(,但不能保证。