作者littleshan (我要加入剑道社!)
看板C_and_CPP
标题Re: [问题] 请问pointer to reference有什麽好处呢?
时间Fri Mar 27 19:43:38 2009
※ 引述《allstarschh (allstars)》之铭言:
: 请问在中间那个function sharedInstance
: 为什麽不把code搬到 sharedInstanceInternal就好了
: 这样就不用用到 reference to pointer了
: 因为用reference to pointer的话
: 有一边free/delete 的话 另一个reference是不是就会有dangling refernece了
: 所以想来请教reference to pointer的好处 thanks
我觉得这是个很有趣的问题。
首先这是个典型的 singleton,除了基本的取得 shared instance 以外,
它还提供一个「检查 instance 是否已被建立」的操作,也就是
sharedInstanceExists()。为了让这个函式能正确运作,
sharedInstanceInternal() 必需要回传 pointer (或 reference to pointer),
好让 sharedInstanceExists() 检查此 pointer 是否为 NULL。
原 po 的意思应该是指 sharedInstance() 与 SharedInstanceInternal()
其实是可以合并的,也就是如下的设计:
JSGlobalData.h:
class JSGlobalData {
public:
static JSGlobalData& sharedInstance();
static bool sharedInstanceExists();
private:
static JSGlobalData* shared_instance;
};
JSGlobalData.cpp:
JSGlobalData* JSGlobalData::shared_instance = NULL;
JSGlobalData& JSGlobalData::sharedInstance()
{
if(!shared_instance)
shared_instance = new JSGlobalData();
return *shared_instance;
}
bool JSGlobalData::sharedInstanceExists()
{
return shared_instance;
}
这样的作法原则上 OK,不过原本的作法把 shared_instance 以 static
variable 的型式封装在 sharedInstanceInternal() 当中,所以任何
JSGlobalData 的 member 要存取它时都必须先呼叫 sharedInstanceInternal(),
未来若要在存取 shared_instance 时添加额外的操作,会比较容易。
(修改 sharedInstanceInternal 即可)
最後,这个 singleton 显然是不考虑 delete,配置给 shared instance
的记忆体空间会在程式结束後自动由 OS 回收。虽然这样的设计并不是很好,
但对於 JSGlobalData 这样的物件 (应该是存放 javascript global variable)
来说,由於不牵涉到其它资源,所以让 OS 来回收记忆体是没有问题的。
而既然不会有人 delete 它,那麽也没有 dangling reference 的问题。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.121.117.19
※ 编辑: littleshan 来自: 59.121.117.19 (03/27 19:47)