按值传递指针

Pass pointer by value

本文关键字:指针 按值传递      更新时间:2023-10-16

具有以下功能:

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

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

因为将对象作为指针提供给函数,所以在方法中对对象执行的所有操作都将保留。

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

CMediaType pMediaType;
GetMediaType( 0, &pMediaType );

正如您目前拥有的那样:

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

在这样的代码中:

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

您在正文pMediaType内部执行的任何操作GetMediaType()都会"保留"在调用站点,因为您正在传递指向mediaType指针

但是,如果要在正文中创建CMediaType的新实例GetMediaType()并将其作为输出指针值返回,调用方在使用后必须以某种方式释放该值(有点像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 规则,使代码尽可能简单(因此,如果可以的话,请避免使用双间接指针)。