gpt4 book ai didi

c++ - 这个单例类会在销毁时自动释放内存吗?

转载 作者:太空宇宙 更新时间:2023-11-04 15:22:52 35 4
gpt4 key购买 nike

我已经创建了一个 Singleton 类,我想知道我的析构函数是否会自动为名为 instance 的静态变量释放内存。

下面的代码会自动释放内存吗?

class SingletonClass
{
SingletonClass()
{

}

~SingletonClass()
{
delete this; // or should I say... delete instance;
}

public:

static SingletonClass* instance;

SingletonClass* getInstance()
{
if (instance != NULL)
return instance;

instance = new SingletonClass();
return instance;
}
};

PS:是否可以只将 instance 设为常规的 Singleton 变量而不是指针?这会是更好的代码练习吗?

最佳答案

这个单例类愉快地在您的程序中注入(inject)未定义的行为

您有一个具有自动存储功能的static 成员变量。作为一个全局变量,它将在您的 main() 例程进入之前构建,并在您的 main() 例程退出后销毁。

因此,一旦您的程序终止并退出 main() 函数,您的 SingletonClass 实例的析构函数将被调用,它会尝试删除这个;但是,该对象不是通过调用 new 分配的,并且为未通过 new 分配的对象调用 delete 会产生未定义的行为。

您可以安全地删除delete this 指令:全局对象在您的程序终止时自动销毁。

编辑:

在对你的问题进行编辑之后,以前是 SingletonClass 类型的 static 变量变成了 类型的 static 变量单例类*。我建议你把它改回来:

static SingletonClass instance;

SingletonClass* getInstance()
{
return &instance;
}

实际上,instance 可以(并且可能应该)甚至是 getInstance() 函数的 static 局部变量>:

SingletonClass* getInstance()
{
static SingletonClass instance;
return &instance;
}

这样您甚至不必为 static 类成员变量提供全局定义

或者,您可以使用智能指针来处理对象的生命周期,但这里没有必要。只需将变量声明为 getInstance()static 局部变量即可。在 C++11 中,它的初始化也将保证线程安全

关于c++ - 这个单例类会在销毁时自动释放内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14993541/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com