当动态创建的单例对象应该被删除时
When the dynamically created singleton object should be deleted?
何时应该删除动态创建的单例对象?它真的需要删除对象显式(从析构函数)或未删除的内存将被OS/系统安全声明一旦程序退出?如果不删除会有什么后果?
通常建议在应用程序退出时销毁该对象。正如在注释中提到的,大多数操作系统会在应用程序终止时释放内存,但是如果你需要清理,例如在单例的析构函数中,那么你需要自己清理它(操作系统清理不会调用析构函数)。
我通常在应用程序退出之前删除它,但这并不总是最好的解决方案。我发现在某些情况下,创建单例只是为了删除,或者在删除后访问并重新创建。
您可以使用atexit()
函数在创建单例时注册一个清理函数。例如:
static Singleton* s_instance = nullptr;
void cleanupSingleton() {
delete s_instance;
}
class Singleton {
public:
static Singleton* instance() {
if(s_instance == nullptr) {
s_instance = new Singleton();
std::atexit(cleanupSingleton);
}
return s_instance;
}
};
PS:不是最好的,线程安全的单例示例,但对于示例来说已经足够好了。
有关atexit()
函数的更多信息,请参阅:Cplusplus.com或cppreference.com
如果使用单例,请使用Meyers的单例:
class Singleton {
public:
static Singleton& instance() {
static Singleton s_instance;
return s_instance;
}
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
private:
Singleton() = default;
~Singleton() { /* Your clean up code */ }
};
在main结束后自动调用析构函数
相关文章:
- 迭代时从向量和内存中删除对象
- C++从对象自己的类中删除对象
- 如何通过对象的类属性删除对象,并返回其对象值?
- 删除对象(具有不同类型)的引用时会发生什么情况?
- 从列表C++中删除对象
- c++ 循环访问对象列表并删除对象
- 从对象本身的容器中删除对象
- 从尝试引用已删除函数的矢量 C++ 中删除对象
- 如何通过指向元组的共享指针删除对象
- 防止通过接口删除对象
- 在 c++ 中从内存中删除对象
- 当对象被删除时,复制被删除对象的对象如何
- 当我使用dynamic_cast并删除对象删除时,析构函数是如何工作的?
- 从内存中删除对象
- 通过C++中的删除方法自行删除对象
- C++ - 析构函数只是释放内存还是实际删除对象
- 如何通过存储在 std::list 中的指针删除对象?
- 如何通过对象参数从指针矢量中删除对象和指针
- 我可以删除对象的右值版本的函数吗?
- 使用对象的索引从矢量中删除对象