【问题标题】:Pass pointer by value按值传递指针
【发布时间】:2014-04-07 15:47:32
【问题描述】:

具有以下功能:

virtual HRESULT GetMediaType(
  int iPosition,
  CMediaType *pMediaType
);

如何调用它,以便通过引用传递 pMediaType 并保留方法中对对象所做的一切?

【问题讨论】:

  • 究竟如何通过引用传递任何其他类型...
  • 除非您需要更改pMediaType 指向的内容,否则这不是问题。对对象内容的任何更改都会直接应用于您传递的地址的对象。

标签: c++ pass-by-reference pass-by-pointer


【解决方案1】:

正如你目前拥有的那样:

virtual HRESULT GetMediaType(
  int iPosition,
  CMediaType *pMediaType
);

在这样的代码中:

CMediaType mediaType;
...GetMediaType(position, &mediaType);

您在GetMediaType() 正文中的pMediaType 上所做的任何事情都在调用站点“保留”,因为您将指针 传递给mediaType

但是,如果您想在 GetMediaType() 主体内创建 CMediaType 的新实例,并将其作为输出指针值返回,调用者在使用后必须以某种方式释放(有点像 COM IUnknown::QueryInterface()),那么你可以使用双间接指针,例如

virtual HRESULT GetMediaType(
  int iPosition,
  CMediaType** ppMediaType    // [OUT] Created by the method, must be freed by the caller
);

使用示例:

CMediaType* pMediaType = nullptr;
...GetMediaType(iPosition, &pMediaType);

... use pMediaType ...
...
... somehow release pMediaType

无论如何,尝试应用 KISS 规则,使代码尽可能简单(所以尽量避免使用双间接指针)。

【讨论】:

    【解决方案2】:

    因为您将对象作为指针提供给函数,所以在方法中对对象所做的一切都会被保留。

    您可以通过以下方式调用它:

    CMediaType pMediaType;
    GetMediaType( 0, &pMediaType );
    

    【讨论】:

    • 但如果我将它声明为像 CMediaType *pMediaType 这样的指针,正确的语法应该是 GetMediaType(0, pMediaType);对吗?
    猜你喜欢
    • 2016-12-25
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 1970-01-01
    • 1970-01-01
    • 2015-05-26
    相关资源
    最近更新 更多