我可以保留这个指针的副本吗?
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 的指针吗?