【问题标题】:CoCreateInstance - What is the reverse?CoCreateInstance - 反过来是什么?
【发布时间】:2015-07-12 04:06:10
【问题描述】:

使用 COM,您可以使用 CoCreateInstance 创建对象。

有没有办法彻底销毁它,以便单元测试的下一部分可以重新开始?

【问题讨论】:

  • 您在寻找IUnknown::Release()吗?
  • 但是如何保证析构函数被调用呢?
  • 在我看来,您无论如何都在尝试测试错误的东西。为什么接收一个新对象对测试很重要?如果它真的很重要,那么不要释放之前的对象。相反,请保留它,并在下一次测试中检查您分配的下一个对象是否确实与前一个不同。 (如果您还没有发布第一个,您只能检查。)
  • @RobKennedy - 每个测试都应该是独立的。从一个新的石板开始。所以我正在测试一个单例的 COM 对象。什么从头开始,但它没有调用析构函数。试图找出原因

标签: c++ c com


【解决方案1】:

每个持有引用的 COM 接口指针的人都可以保证该对象是活动的,因此如果不知道持有指向您的 COM 对象的接口指针的每个人,并且能够请求释放,则无法确保该对象已被销毁。

你当然可以试试

for(; ; )
{
  if(pFoo->Release() == 0)
    break;
}

但是,即使这样,您 (a) 可能会陷入死循环,(b) 那些引用您的对象的人在尝试访问被破坏的对象时会遇到访问冲突/未定义的行为(他们仍然希望引用的对象是活动的)。

另一种方法是使用包装器对象并在内部管理真正的 COM 对象而不暴露它。并且您将方法调用从包装器转发到内部对象。然后你可以让你的包装器释放内部引用,这通常会导致内部对象的破坏。

【讨论】:

  • 如何找出 VS 2010 中的 COM 对象持有什么?
  • 没办法,这部分是轻量级的。 COM 对象看不到/不知道谁在使用它。它只管理一个引用计数器,以便它知道何时不再使用它并且该自毁了。
  • SO 调试困难。因为我想创建(setUp)和销毁(tearDown)对象进行测试,但不确定它们为什么不调用析构函数。以及找出谁没有打球的提示?
  • 在大多数情况下,您会很高兴释放您持有的所有指针。对于大多数 COM 对象,您仍然可以检查 IUnknown::Release 返回值并将其与零进行比较,以确保您的最终版本是实际销毁。如果您可以在客户端(单元测试)方面使其更复杂并增加发生实际破坏的机会 - 启动一个子进程并在那里进行单元测试。终止进程您还可以终止来自各种工作线程的引用,与封送处理、与引用泄漏等有关。
  • 请注意,IUnknown::Release 返回的值不能依赖于真正的引用计数。来源:msdn.microsoft.com/en-us/library/windows/desktop/…。例如:代理对象不需要返回真正的引用计数,只需要返回代理对象的引用计数即可。
猜你喜欢
  • 1970-01-01
  • 2017-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-15
  • 2012-06-29
  • 2011-02-27
  • 1970-01-01
相关资源
最近更新 更多