我可以保留这个指针的副本吗?

Posted

技术标签:

【中文标题】我可以保留这个指针的副本吗?【英文标题】:Am I allowed to keep a copy of this pointer? 【发布时间】:2013-11-21 16:21:38 【问题描述】:

我正在为Remote Desktop Connection Broker 编写一个插件,在它声明的ITsSbPlugin::Initialize 方法中

插件应在指定的 ITsSbPluginNotifySink 接收器对象上调用 OnInitialized。

我这样做了,但是我注意到 ITsSbPluginNotifySink 它也有一个 OnTerminated() 方法。 ITsSbPlugin::Terminate 中没有说你需要打电话给OnTerminated(),但我应该吗?

如果我确实需要调用OnTerminated(),我是否应该将传入的ITsSbPluginNotifySink 复制到一个局部变量并使用它来调用OnTerminated()

class CTsSbPluginProxy : public ITsSbPlugin

public:
    //(Snip)

    HRESULT STDMETHODCALLTYPE Initialize(
        __RPC__in_opt ITsSbProvider *pProvider,
        __RPC__in_opt ITsSbPluginNotifySink *pNotifySink,
        __RPC__in_opt ITsSbPluginPropertySet *pPropertySet);

    HRESULT STDMETHODCALLTYPE Terminate(HRESULT hr);


private:
    //(Snip)
    ITsSbPluginNotifySink *m_pNotifySink
;

HRESULT STDMETHODCALLTYPE CTsSbPluginProxy::Initialize(
    __RPC__in_opt ITsSbProvider *pProvider,
    __RPC__in_opt ITsSbPluginNotifySink *pNotifySink,
    __RPC__in_opt ITsSbPluginPropertySet *pPropertySet)

    //(Snip)

    m_pNotifySink = pNotifySink;
    m_pNotifySink->OnInitialized(S_OK);
    return S_OK;


HRESULT STDMETHODCALLTYPE CTsSbPluginProxy::Terminate(HRESULT hr)

    //(Snip)

    //Is this legal?
    m_pNotifySink->OnTerminated();
    return S_OK;

【问题讨论】:

我对这些特定的界面并不熟悉,但随便看看文档,我会说你是在正确的轨道上。不过有一件事:如果你想让指针保持在Initialize 调用之外,你必须调用指针上的AddRef;然后,您必须在不再需要它时调用Release(可能在Terminate 中,就在OnTerminate 调用之后)。否则,该对象可能会过早地被销毁,并且您将留下一个悬空指针。 @IgorTandetnik 我刚刚发现了this msdn arcive,其中包含示例代码,它们的作用也与我发布的相似。发表你所说的作为答案,我会接受。 【参考方案1】:

可能缺少 MSDN 主要文档,但我找到了this msdn code archive。它包含一个示例项目,他们确实保留了ITsSbPluginNotifySink 的副本,所以我相信我的第一个假设是正确的,我应该保留指针的副本并在最后释放它(也感谢 Igor Tandetnik @987654322 @)

【讨论】:

您可以通过使用智能指针消除对 AddRef/Release 的需要。 Microsoft 提供了一些可供选择,请参阅***.com/questions/5634996/…

以上是关于我可以保留这个指针的副本吗?的主要内容,如果未能解决你的问题,请参考以下文章

(为啥)我应该在打开的文档中保留指向 FileWrapper 的指针吗?

指针是不是有可能在没有任何数据副本的情况下由向量拥有?

指针在函数中的作用

创建 NSManagedObject 的副本

(为啥)git super-repository 保留的不仅仅是指向子模块的指针吗?

在 C++ 中通过指针捕获异常