- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我已经创建了一个 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/
我最近购买了《C 编程语言》并尝试了 Ex 1-8这是代码 #include #include #include /* * */ int main() { int nl,nt,nb;
早上好!我有一个变量“var”,可能为 0。我检查该变量是否为空,如果不是,我将该变量保存在 php session 中,然后调用另一个页面。在这个新页面中,我检查我创建的 session 是否为空,
我正在努力完成 Learn Python the Hard Way ex.25,但我无法理解某些事情。这是脚本: def break_words(stuff): """this functio
我是一名优秀的程序员,十分优秀!