使用全局对象作为COM类工厂合法吗?

时间:2011-07-29 07:39:17

标签: c++ visual-c++ com factory-pattern

在一个out-proc COM服务器中,我需要一个我将传递给CoRegisterClassObject()的类工厂。 CreateInstance()仅使用new创建对象实例,不需要存储数据。 LockServer()将修改不属于工厂实例的共享锁定计数器。

所以实际上我不需要在工厂内存储任何不同的数据,只有一个对象就可以了。另外,我不想照顾那个对象的生命周期。这就是为什么我很想将工厂声明为全局变量(在构造函数中将refcount设置为1):

//Server.cpp
CMyFactory factory;

一旦我这样做,我就不再满足于delete thisRelease() - 该代码永远不会在正常条件下运行(refcount从1开始,永远不会达到零),如果它运行则导致未定义的行为。所以我想从工厂中删除引用计数器并像这样实现AddRef()Release()

ULONG CMyFactory::AddRef()
{
   return 1;
}
ULONG CMyFactory::Release()
{
   return 1;
}

因此引用计数只会没有副作用,没有delete this

所描述的实施是否合法?它会引起任何问题吗?

2 个答案:

答案 0 :(得分:1)

是的,它完全合法,甚至在COM书籍的某处记录。

答案 1 :(得分:1)

只要您以不同的方式控制流程生命周期,就可以接受。在这种情况下删除它是灾难,因为对象是全局的而不是动态对象。