C++ C++;方法应该接受一个指向指针的指针,接收一个地址并且仍然有效

C++ C++;方法应该接受一个指向指针的指针,接收一个地址并且仍然有效,c++,pointers,C++,Pointers,我正在研究如何创建一个简单的Direct2D应用程序,作者定义了一个类模板和一个名为SafeRelease的方法,如下所示: template<class Interface> inline void SafeRelease( Interface **ppInterfaceToRelease ) { if (*ppInterfaceToRelease != NULL) { (*ppInterfaceToRelease)->

我正在研究如何创建一个简单的Direct2D应用程序,作者定义了一个类模板和一个名为
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();