关于引用计数 两个COM类A和B,A的成员属性引用B,B的成员属性引用A,两者的引用计数怎样处理? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 >>A的成员属性引用B,B的成员属性引用A什么意思?能举例说明吗?另外,引用计数是对接口来说的. 测试过了,两者不会被释放,直到程序结束。简单点说,就是A引用B即有B.AddRef(),在A::FinalRelease()里才被B.Release();而B引用A即有A.AddRef(),在B::FinalRelease()里才被A.Release()。这种情况下,两者“虽不同生,但却同死,而且最后才死”。另外,我认为引用计数是对类而言的,接口只是纯粹的“接口”,没有需要也没能力“计数”。而平常所说的COM接口,在C++中只是一个类所暴露出来的部分接口。 只有这样才是合理的:IA->AddRef(),IA->Release()。你这里的A是接口吗?所谓的A引用B什么意思?能给个例子吗?疑惑ing 对,互相抓住引用计数的两个对象,想要release对象,必须先主动解散它们,否则就谁也删部掉了。互相抓住引用计数的情况在回调接口时很常见。 详细分析可见《深入解析ATL》关于智能指针实现的那一节讲了为什么release的实现是:q = p; p = null; delete p;而不是delete p; p = null;就是为了避免lz所说的情况 1.6 资源管理显式的释放智能指针Release方法Template <class T> void CComPtr<T>::Release(){ Iunknown* pTemp = p; If(pTemp){p = NULL; pTemp->Release();}}为什么不这样实现?If(p){p->Release(); p = NULL};来看看下面的情况Class A{ CComPtr<B> m_ptB;};Class B{ CComPtr<A> m_ptA}A a;B b;b.m_ptA = &a;a.m_ptB = &b;// 注意!a.m_ptB.Release();/* 下面为实际的底层调用a.m_ptB.Release(); =>If(m_ptB.p){m_ptB.p->Release(); m_ptB.p = NULL;} =>m_ptB.p->Release() =>b对象调用析构函数,解除对a的引用,a的引用为0,开始析构, m_ptB析构,发现m_ptB.p不为NULL,对其调用Release。第2次对m_ptB调用Release,行为未定义。*/ 请问这几句代码能不能简化? 这个异常如何解决 向局域网内的机器拷贝文件的系统函数。。 请问一个从对话框传值到struct的问题 请教CListCtrl中排序问题的compare function. 谢谢! 提个小问题,现在vc++的主流是6.0还是7.0? 请高手指点,很奇怪的问题!!请大虾不吝赐教,不胜感激! 设置ListCtrl的背景色 球的体积公式是什么? 为何下面这段代码不能将bmp图象写到数据库中? 一个简单的COM问题! 小弟初学ActiveX,求助各位大虾,3个基础问题
什么意思?能举例说明吗?
另外,引用计数是对接口来说的.
简单点说,就是A引用B即有B.AddRef(),在A::FinalRelease()里才被B.Release();而B引用A即有A.AddRef(),在B::FinalRelease()里才被A.Release()。
这种情况下,两者“虽不同生,但却同死,而且最后才死”。另外,我认为引用计数是对类而言的,接口只是纯粹的“接口”,没有需要也没能力“计数”。而平常所说的COM接口,在C++中只是一个类所暴露出来的部分接口。
你这里的A是接口吗?
所谓的A引用B什么意思?能给个例子吗?疑惑ing
讲了为什么release的实现是:
q = p; p = null; delete p;
而不是
delete p; p = null;
就是为了避免lz所说的情况
显式的释放智能指针
Release方法
Template <class T> void CComPtr<T>::Release()
{
Iunknown* pTemp = p;
If(pTemp){p = NULL; pTemp->Release();}
}为什么不这样实现?
If(p){p->Release(); p = NULL};
来看看下面的情况
Class A
{
CComPtr<B> m_ptB;
};
Class B
{
CComPtr<A> m_ptA
}
A a;
B b;
b.m_ptA = &a;
a.m_ptB = &b;// 注意!
a.m_ptB.Release();
/* 下面为实际的底层调用
a.m_ptB.Release(); =>
If(m_ptB.p){m_ptB.p->Release(); m_ptB.p = NULL;} =>
m_ptB.p->Release() =>
b对象调用析构函数,解除对a的引用,a的引用为0,开始析构, m_ptB析构,发现m_ptB.p不为NULL,对其调用Release。第2次对m_ptB调用Release,行为未定义。
*/