如何析构单例实例,或者为什么以下代码适用于析构函数?
How to destruct a singleton instance, or why the follow code works for destructor?
以下代码用于删除单例实例,为什么删除前的工作是必要的?
// @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;
可能会导致编译器发出警告(具体取决于编译器(,但不能保证。
相关文章:
- 与C代码相比,为什么C++代码不需要"#define _POSIX_C_SOURCE 200809L"?
- 为什么代码给出分段错误?
- 不理解为什么代码没有产生所需的答案
- 为什么代码段会引发浮点异常?
- 我不确定为什么代码没有运行,它在编译时抛出错误,说它无法找到 PrintArray()
- 为什么代码会崩溃?(在CPP中)
- 为什么代码使用 std::map 无法编译?
- 为什么代码会抛出非法内存访问错误
- 为什么代码不能返回正确的值?
- 为什么 C++ 代码实现的性能不比 python 实现更好?
- 为什么代码告诉我vectorsubsibrtion超出了范围
- 字符指针值为空白,为什么代码不打印5
- 为什么代码中没有处理每个逗号字符?
- 为什么代码在输入大于10的输入上会分割故障
- 为什么C++代码不起作用(strncpy_s)?
- 为什么代码无法打印此 2D 数组的元素?
- 为什么代码没有cout?
- 为什么代码中的模板参数推导/替换失败?-.
- 为什么代码在 c++ 中无法正常运行
- 在C++中,为什么代码示例在重载运算符时经常使用内存位置