Имея следующую функцию:
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()
body и вернуть его в качестве значения выходного указателя, который вызывающий должен как-то освободить после использования (вроде как 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, сделав код максимально простым (поэтому избегайте указателей с двойным косвенным указанием, если можете).