C++ C++;方法应该接受一个指向指针的指针,接收一个地址并且仍然有效
我正在研究如何创建一个简单的Direct2D应用程序,作者定义了一个类模板和一个名为C++ C++;方法应该接受一个指向指针的指针,接收一个地址并且仍然有效,c++,pointers,C++,Pointers,我正在研究如何创建一个简单的Direct2D应用程序,作者定义了一个类模板和一个名为SafeRelease的方法,如下所示: template<class Interface> inline void SafeRelease( Interface **ppInterfaceToRelease ) { if (*ppInterfaceToRelease != NULL) { (*ppInterfaceToRelease)->
SafeRelease
的方法,如下所示:
template<class Interface>
inline void SafeRelease(
Interface **ppInterfaceToRelease
)
{
if (*ppInterfaceToRelease != NULL)
{
(*ppInterfaceToRelease)->Release();
(*ppInterfaceToRelease) = NULL;
}
}
我刚开始学C++,我不知道为什么这些电话是合法的。显然,我对指针作为过程参数的理解是有缺陷的,所以请纠正我。接受指针类型的过程如何接受地址?另外,当我按下F12键时,Visual Studio找不到
Release
方法的声明,但我怀疑它与COM Release方法有关,所以解释一下它内部的情况会很有帮助,因为我在调试时无法“介入”它。所以-代码工作得很好,我只是想知道为什么。可以找到完整的源代码。它有助于简化事情,基本上只需将内存想象成一个巨大的数组,在那里你有地址(你可以把地址想象成数组的索引),然后你就有了内容本身(可以是任何内容)
因此,接口**可以被认为是指向内存的地址,该内存包含另一个内存地址,该内存地址包含接口对象
想象一下
Name Type Memory Address Contents
interfacePtrPtr Interface** 0x1 The address 0x2
interfacePtr Interface* 0x2 The address 0x3
interface Interface 0x3 - 0xFF? An interface object
在这个虚构的例子中,让我们假设我们从接口开始,然后使用&interface获得我们的interfacePtr,然后使用&interfacePtr获得interfacePtr
您也可以使用*interfacePtrPtr来获取interfacePtr,然后*interfacePtr最终返回到接口本身
那么在你的例子中,当
SafeRelease(&m_pDirect2dFactory);
调用时,函数将被指定接口指针的地址—如果愿意,则为接口指针
(*ppInterfaceToRelease)->Release();
然后用*取消引用该指针,将指针指针转换回常规指针,然后使用->速记将指针取消引用到接口对象本身,并调用其释放方法
希望这是有意义的。操作员的地址
&
返回一个指针,指向其地址所在的对象。因此,如果这里的东西是指针,那么一切都很好。符号约定m_pSomething表明它们是指针。m表示类成员,p表示指针。指针是地址,地址是指针。你有什么区别?顺便说一句,这种风格已经过时了,而且很危险std::unique_ptr
或类似工具将负责安全地销毁成员指针、处理异常或诸如此类的事情,并且您根本不需要显式定义的析构函数。引用运算符&
返回它前面的变量的地址。我理解这个符号,并且事实上所讨论的变量都是指针,但是它们前面都有&
,并且将解析为地址。我所做的区别(我猜)是,这个方法应该接收指针变量,而不是指针指向的地址。从上一条注释开始,我才意识到问题所在,因为&
将返回指针变量的地址,而不是指针指向的地址。。如果有人想简单回答这个问题,我会接受的。我现在明白了。
(*ppInterfaceToRelease)->Release();