我对动态分配的静态全局对象有非常具体的问题。在我的项目中,我有很少的对象,我需要在整个应用程序生命周期中从线程的各个位置访问。我想在应用程序初始化时创建它并在应用程序退出时解压缩。所以我试着跟着,
头文件: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;
}
这段代码似乎很有用,但我想澄清一些事情。
请让我知道你的意见。
非常感谢你!
答案 0 :(得分:2)
只创建一次对象,然后返回对象的引用。 (我想要这个,因为MyObject封装了很少的系统资源,如文本文件)
MyObject*
是指针类型,而不是引用类型。 gMyObject
是指向MyObject
的指针类型的变量。当Application退出时,MyObject会被销毁。
delete
,所以你有泄漏。在哪里创建对象Heap(因为我正在使用new)或全局内存(因为我使用静态)?还是我违反任何OOP原则?
new
,则会在'heap'处创建对象。 static
仅适用于指向对象的指针,而不适用于对象本身。可以从多个线程调用MyObjectFactory :: GetMyObject()吗?
这是一种与Singleton有些相似的好方法吗?
答案 1 :(得分:2)
实现正确破坏和正确初始化以及最小头痛的标准方法使用块本地静态,如下所示:
<强> foo.hpp:强>
struct Foo
{
static Foo & get();
// ...
};
<强> Foo.cpp中:强>
#include "foo.hpp"
Foo & Foo::get()
{
static Foo impl;
return impl;
}
现在,您可以在代码中的任何位置说Foo::get()
。没有指针,没有动态分配,没有任何东西泄露。一个真正的静态单身人士。
答案 2 :(得分:0)
只创建一次对象,然后返回对象的引用。
如果您的程序是单线程的,那么(尽管在您的示例中它返回的是指针而不是引用)。否则存在两个线程创建对象的单独副本的危险;或者实际上发生了其他任何事情,因为在这种情况下行为是不确定的。
当Application退出时,MyObject会被销毁。
不,使用new
创建的对象只会被delete
销毁,而不会自动销毁,因此此对象会被泄露。这是否是一个问题取决于它使用的所有资源是否由系统自动回收。
在哪里创建对象Heap(因为我正在使用new)或全局内存(因为我使用静态)?
该对象是从免费商店(又名堆)分配的;指向它的指针是静态的。
可以从多个线程调用MyObjectFactory :: GetMyObject()吗?
只有在可以确保在任何一个对象调用之前已经创建了对象时才会这样做。
这是一种与Singleton有些相似的好方法吗?
在C ++中没有很好的方法可以实现这一点。最好的方法是完全避免全局可访问的对象;在某处创建它,并将引用传递给任何需要它。
如果你真的想要一个全局对象,那么有几个选项,每个都有自己的死亡陷阱: