2014-03-05 140 views
1

有一个如下功能:传递指针的值

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

我怎么称呼它,这样pMediaType作为参考,一切都做的方法传递的对象被保留?

+0

您确实如何通过引用传递任何其他类型... –

+0

与&运算符? – Luke

+5

除非您需要更改'pMediaType'指向的内容,否则这不是问题。对象内容的任何更改都直接适用于您传递的地址的对象。 – crashmstr

回答

5

因为您将该对象作为指针赋予该函数,所以对该方法中的对象执行的所有操作都将保留。

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

CMediaType pMediaType; 
GetMediaType(0, &pMediaType); 
+0

但如果我声明它像一个指针:CMediaType * pMediaType,正确的语法将GetMediaType(0,pMediaType);对? – Luke

0

正如你现在知道了:

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

在这样的代码:

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

什么你在上做10里面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规则,保持代码尽可能简单(这样可以避免双重间接指针,如果可以的话)。