我有一个关于动态分配的静态全局对象的非常具体的问题。在我的项目中,我需要在整个应用程序生命周期中从不同位置跨线程访问的对象很少。我想在应用程序退出时在应用程序初始化和分发时创建。所以我试着跟随,
头文件:MyObjectFactory.h
class MyObjectFactory{
public:
static MyObject* GetMyObject();
};
源文件:MyObjectFactory.cpp
static MyObject* gMyObject = 0;
MyObject* MyObjectFactory::GetMyObject(){
if(gMyObject == 0)
{
gMyObject = new MyObject();
}
return gMyObject;
}
这段代码似乎可以工作,但我想清除一些东西。
- 对象将只创建一次,然后返回对对象的引用。 (我想要这个是因为 MyObject 封装了很少的系统资源,比如文本文件)
- MyObject 在应用程序退出时被销毁。
- 对象创建堆(因为我使用的是 new )或全局内存(因为我使用的是 static )在哪里?还是我违反了任何 OOP 原则?
- 可以从多线程调用 MyObjectFactory::GetMyObject() 吗?
- 这是实现类似于 Singleton 的好方法吗?
请让我知道您的意见。
非常感谢!
最佳答案
以最少的麻烦实现正确的销毁和正确的初始化的标准方法是使用 block 局部静态,如下所示:
foo.hpp:
struct Foo
{
static Foo & get();
// ...
};
foo.cpp:
#include "foo.hpp"
Foo & Foo::get()
{
static Foo impl;
return impl;
}
现在您可以在代码的任何地方使用 Foo::get()
。没有指针,没有动态分配,也没有任何泄漏。一个真正的静态单例。
关于c++ - 全局静态动态分配对象 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10802360/