这些天在弄有关的智能指针,因为其原理与通用的智能指针相似,但并不完全相同,故只是借鉴学习一下CComPtr,这是按照 msdn上学习的,可能在有的方法还不是理解太透,希望不会引起什么误解。
CComPtr()
这是一个构造函数,初始化成员变量,默认的构造函数是将P设为NULL,拷贝构造函数则是将p指向了LP并且通过P调用AddRef,然后在其析构时会通过P调用Release。
Detach():
这个函数返回的是一个一个成员指针,同时将自己的成员指针设为了NULL,因为是设为了NULL那么在析构
并不会调用Release,也就是说其引用计数并没有变化。
Release():
这个方法是调用了基类的Release,并把p设为了NULL,
IsEqualObject(IUnknown *pOther):
用来比较两个对像是否相等同, 这也调用了基类的IsEqualObject.
Attach(T* p2):
这个方法将一个指针赋给了国一个指针而没有增加其引用计数。
HRESULT CopyTo(T** ppT );
将其内部指针拷贝给了目标指针,如果成功的话将添加引用计数。如果PPT为空的话则返回错误。
HRESULT SetSite(IUnknown* punkParent );
为指向其管理对像的指针设置大小,内部指针必须指向其已实现的对象。
Establishes a connection point with the object pointed to by this smart pointer.
HRESULT Advise(IUnknown* pUnk,const IID& iid,LPDWORD pdw );
通过这个智能指针与对像建立一个联接指针。 第一个参数是接引对像的指针,
HRESULT CoCreateInstance(
REFCLSID rclsid,
LPUNKNOWN pUnkOuter = NULL,
DWORD dwClsContext = CLSCTX_ALL );
HRESULT CoCreateInstance(
LPCOLESTR szProgID,
LPUNKNOWN pUnkOuter = NULL,
DWORD dwClsContext = CLSCTX_ALL ); 在安全模式上为对像建立一个实例。
template <class Q>HRESULT QueryInterface(Q** pp );&<60; 这个方法在安全方式中调用了QUERYINTERFACE
操作有类型T*,*,&,->,=,!<,==
这是内部定义一个有关计数引用的例子:
tf_stdptr<IRawStreamCodec> spRawStreamCodec;
&<60;&<60;&<60; TFCreateInstance (TFCLSID_CRawStreamCodec, &spRawStreamCodec); //1
&<60;&<60;&<60; {{
&<60;&<60;&<60; &<60;&<60;&<60; tf_stdptr<IRawStreamCodec> spUnknown = spRawStreamCodec;// ?2
&<60;&<60;&<60; }}
&<60;&<60;&<60; // ?1
&<60;&<60;&<60; {{
&<60;&<60;&<60; &<60;&<60;&<60; tf_stdptr<IRawStreamCodec> spUnknown = spRawStreamCodec;// 2 sp->p = spR;
sp->p->Addref
&<60;&<60;&<60; &<60;&<60;&<60; spUnknown.detach(); //2 //sp->p = null;
&<60;&<60;&<60; }}
&<60;&<60;&<60; //2
&<60;&<60;&<60; {{
&<60;&<60;&<60; &<60;&<60;&<60; tf_stdptr<IRawStreamCodec> spUnknown;`
&<60;&<60;&<60; &<60;&<60;&<60; spUnknown.attach(spRawStreamCodec); //2
&<60;&<60;&<60; }}
&<60;&<60;&<60; //1
&<60;&<60;&<60; {{
&<60;&<60;&<60; &<60;&<60;&<60; tf_stdptr<IRawStreamCodec> spUnknown;
&<60;&<60;&<60; &<60;&<60;&<60; spUnknown.attach(spRawStreamCodec); //1
&<60;&<60;&<60; &<60;&<60;&<60; spUnknown.detach(); //1
&<60;&<60;&<60; }}
&<60;&<60;&<60; //1
通过这个例子能很好的说明引用计数这个概念了。
CComPtr()
这是一个构造函数,初始化成员变量,默认的构造函数是将P设为NULL,拷贝构造函数则是将p指向了LP并且通过P调用AddRef,然后在其析构时会通过P调用Release。
Detach():
这个函数返回的是一个一个成员指针,同时将自己的成员指针设为了NULL,因为是设为了NULL那么在析构
并不会调用Release,也就是说其引用计数并没有变化。
Release():
这个方法是调用了基类的Release,并把p设为了NULL,
IsEqualObject(IUnknown *pOther):
用来比较两个对像是否相等同, 这也调用了基类的IsEqualObject.
Attach(T* p2):
这个方法将一个指针赋给了国一个指针而没有增加其引用计数。
HRESULT CopyTo(T** ppT );
将其内部指针拷贝给了目标指针,如果成功的话将添加引用计数。如果PPT为空的话则返回错误。
HRESULT SetSite(IUnknown* punkParent );
为指向其管理对像的指针设置大小,内部指针必须指向其已实现的对象。
Establishes a connection point with the object pointed to by this smart pointer.
HRESULT Advise(IUnknown* pUnk,const IID& iid,LPDWORD pdw );
通过这个智能指针与对像建立一个联接指针。 第一个参数是接引对像的指针,
HRESULT CoCreateInstance(
REFCLSID rclsid,
LPUNKNOWN pUnkOuter = NULL,
DWORD dwClsContext = CLSCTX_ALL );
HRESULT CoCreateInstance(
LPCOLESTR szProgID,
LPUNKNOWN pUnkOuter = NULL,
DWORD dwClsContext = CLSCTX_ALL ); 在安全模式上为对像建立一个实例。
template <class Q>HRESULT QueryInterface(Q** pp );&<60; 这个方法在安全方式中调用了QUERYINTERFACE
操作有类型T*,*,&,->,=,!<,==
这是内部定义一个有关计数引用的例子:
tf_stdptr<IRawStreamCodec> spRawStreamCodec;
&<60;&<60;&<60; TFCreateInstance (TFCLSID_CRawStreamCodec, &spRawStreamCodec); //1
&<60;&<60;&<60; {{
&<60;&<60;&<60; &<60;&<60;&<60; tf_stdptr<IRawStreamCodec> spUnknown = spRawStreamCodec;// ?2
&<60;&<60;&<60; }}
&<60;&<60;&<60; // ?1
&<60;&<60;&<60; {{
&<60;&<60;&<60; &<60;&<60;&<60; tf_stdptr<IRawStreamCodec> spUnknown = spRawStreamCodec;// 2 sp->p = spR;
sp->p->Addref
&<60;&<60;&<60; &<60;&<60;&<60; spUnknown.detach(); //2 //sp->p = null;
&<60;&<60;&<60; }}
&<60;&<60;&<60; //2
&<60;&<60;&<60; {{
&<60;&<60;&<60; &<60;&<60;&<60; tf_stdptr<IRawStreamCodec> spUnknown;`
&<60;&<60;&<60; &<60;&<60;&<60; spUnknown.attach(spRawStreamCodec); //2
&<60;&<60;&<60; }}
&<60;&<60;&<60; //1
&<60;&<60;&<60; {{
&<60;&<60;&<60; &<60;&<60;&<60; tf_stdptr<IRawStreamCodec> spUnknown;
&<60;&<60;&<60; &<60;&<60;&<60; spUnknown.attach(spRawStreamCodec); //1
&<60;&<60;&<60; &<60;&<60;&<60; spUnknown.detach(); //1
&<60;&<60;&<60; }}
&<60;&<60;&<60; //1
通过这个例子能很好的说明引用计数这个概念了。