【发布时间】:2016-09-10 08:03:39
【问题描述】:
我正在编写利用 COM 接口的代码。我的代码基于我在网上找到的示例。在这种情况下,我不想使用智能指针,因为我想了解 COM 的基础知识,而不仅仅是让智能指针类为我完成所有工作。
为了解决我的问题,假设我有一个类似于以下的课程:
public class TestClass
{
private:
IUnknown *m_pUnknown;
public:
TestClass();
void AssignValue();
}
TestClass::TestClass()
{
m_pUnknown = NULL;
}
void TestClass::AssignValue()
{
IUnknown *pUnknown = NULL;
//Assign value to pUnknown here - not relevant to my questions
m_pUnknown = pUnknown;
pUnknown->Release();
}
现在谈谈我的具体问题。
1) 我见过的示例在初始化值时不使用AddRef(),例如在类构造函数中。当 COM 指针第一次被赋值时,AddRef() 是否在幕后“自动”发生?
2) 虽然我的代码示例没有显示出来,但我的理解是在AssignValue()方法中,当你赋值第二个值覆盖pUnknown的值时(原来是在类构造函数中设置的),@ 987654326@ 被自动调用。在将新值分配给pUnknown 后,它的引用计数为零。我需要在重新分配后立即致电pUnknown->AddRef()。我的理解正确吗?
【问题讨论】:
-
当使用原始 com 指针时,永远不会自动调用 addref 和 release。
-
*m_pUnknown = *pUnknown没有意义。您只是在对没有成员的IUnknown实例进行切片,因此充其量是无操作。此外,m_pUnknown是NULL(至少最初是这样)并且不能被取消引用(当你尝试时,你可能会崩溃)。你想要if (m_pUnknown) { m_pUnknown->Release(); } m_pUnknown = pUnknown; -
AddRef可能隐含地发生在“在这里为 pUnknown 赋值 - 与我的问题无关”部分(这恰好与您的问题相关,与您的保证相反)。大多数获取 COM 指针的方法(例如CoCreateInstance)都会产生一个已经适合AddRefed 的方法。 -
"覆盖
pUnknown的值(原来在类构造函数中设置),"pUnknown是AssignValue中的一个局部变量。它当然没有在类构造函数中设置,甚至也不存在。 “Release()会自动调用。” 不,不是。智能指针可以做到这一点 - 但你故意不使用它们。