当前位置: 首页 > news >正文

标准版网站制作/谷歌关键词排名查询

标准版网站制作,谷歌关键词排名查询,wordpress 看板娘,白领兼职做网站引用计数简介AddRef 和 Release实现的是一种名为引用计数的内存管理技术。引用计数是使组件能够自己将自己删除的最简单同时效率最高的方法。COM组件维护一个称作是引用计数的数值。当客户从组件取得一个接口时,此引用计数值将增1。当客户使用完某个接口后&#xff…
引用计数简介
AddRef 和 Release实现的是一种名为引用计数的内存管理技术。引用计数是使组件能够自己将自己删除的最简单同时效率最高的方法。COM组件维护一个称作是引用计数的数值。当客户从组件取得一个接口时,此引用计数值将增1。当客户使用完某个接口后,组件的引用计数值将减1。当引用计数值为0时,组件即可将自己从内存中删除。
规则:
1)在返回之前调用AddRef。对于那些返回接口的指针函数,在返回之前应用相应的指针调用AddRef。这些函数包括QueryInterface及CreateInstance。这样当客户从这种函数得到一个接口后,它将无需调用AddRef。
2)使用完接口后调用Release。在使用完某个接口之后应调用些接口的Release函数。
IUnKnown* pIUnknown = CreateInstance();

IX* pIX = NULL;
HRESULT hr = pIUnknown->QueryInterface(IID_IX,(void**)&pIX);
pIUnknown->Release();
if (SUCCEEDED(hr))
{
pIX->Fx();
pIX->Release();
}
3)在赋值之后调用AddRef。在将一个接口指针赋给另外一个接口指针时,应调用AddRef。换句话说,在建立接口的另外一个引用之后应增加相应组件的引用计数。
IUnKnown* pIUnknown = CreateInstance();

IX* pIX = NULL;
HRESULT hr = pIUnknown->QueryInterface(IID_IX,(void**)&pIX);
pIUnknown->Release();
if (SUCCEEDED(hr))
{
pIX->Fx();
IX* pIX2 = pIX;
pIX2->AddRef();
pIX2->Fx();
pIX2->Release();
pIX->Release();
}

引用计数接口:
组件可以选择是对整个组件维护一个引用计数不是对每一个接口分别维护一个引用计数
///
AddRef和Release的实现
ULONG __stdcall AddRef()
{
return ++m_cRef;
}
ULONG __stdcall Release()
{
if (--m_cRef==0)
{
delete this;
return 0;
}
return m_cRef;
}
许多情况下用InterlockedIncrement和InterlockedDeCrement来实现 AddRef和Release。这两个函数可以确保在同一时刻只会有同一个线程来访问成员变量。

ULONG __stdcall AddRef()
{
return InterlockedIncrement(&m_cRef);
}
ULONG __stdcall Release()
{
if (InterlockedDeCrement(&m_cRef)==0)
{
delete this;
return 0;
}
return m_cRef;
}


何时进行引用计数
1)引用计数的优化
IUnKnown* pIUnknown = CreateInstance();
IX* pIX = NULL;
HRESULT hr = pIUnknown->QueryInterface(IID_IX,(void**)&pIX);
pIUnknown->Release();
if (SUCCEEDED(hr))
{
IX* pIX2 = pIX;
pIX2->AddRef();
pIX->Fx();
pIX2->Fx();
pIX>Release();
pIX2>Release();
}
对于上面的代码,只有当客户将pIX释放时组件才会被从内存中删除。而客户只是在用完了pIX和pIX2之后才会将释放。正是由于组件只是在被释放之后才被从内存中删除掉,因此可以保证在pIX2的生命期内相应 的组件将一直在内存中。因此对pix2并不真的需要AddRef和Release。

动态链接
1)从DLL中输出函数
extern "C"
IUnknown* CreateInstance()
{
IUnknown* pI=(IUnknown*)(void*) new CA;
pI->AddRef();
return pI;
}
在函数定义前加上 extern "C"可防止c++编译器在函数名称上加上类型信息。
例如:
?CreateInstance@@YAPAUUnknown@@XZ
dumpbin -exports *.dll
可将dll的函数导出
2)DLL的装载
using namespace std;

typedef IUnknown* (*CREATEFUNCPTR)();
IUnknown *CallCreateInstance(char* name)
{
HINSTANCE hComponent = ::LoadLibrary(name);
if (hComponent == NULL)
{
cout<<"error load library"<<endl;
return NULL;
}
CREATEFUNCPTR CreateInstance =
(CREATEFUNCPTR)::GetProcAddress(hComponent,"CreateInstance");
if (CreateInstance==NULL)
{
cout<<"can not find the function"<<endl;
return NULL;
}
return CreateInstance();
}
使用DLL的原因:
动态链接库将被映射到它们所链接的应用程序的进程空间中
//




http://www.lbrq.cn/news/1619587.html

相关文章:

  • 网站建设实战视频教程/营销课程培训
  • 微信上浏览自己做的网站/聊城疫情最新消息
  • 找工作在什么网站找比较好/汕头seo计费管理
  • 贵州省省建设厅网站/正规网络教育培训机构
  • 白城北京网站建设/搜索引擎大全全搜网
  • 网络优化是做啥的/适合seo的建站系统
  • 网站建设需要哪些网络技术/网络营销公司如何建立
  • 网站系统正在升级维护/第三方推广平台
  • 中国建设招标网 官方网站下载/诊断网站seo现状的方法
  • 新疆克拉玛依建设局网站/推广营销软件app
  • 贵州省电力建设施工企业商会/优化网络培训
  • 深圳网站开发哪个公司好/上海seo优化培训机构
  • 网站目录权限 user/应用商店下载
  • 巨野网站建设/seo外包多少钱
  • 网页界面设计中交互设计是指/关键词诊断优化全部关键词
  • 创建一个网站 站点根文件夹为/今日预测足球比分预测
  • 可自己绘图装修的app/百度关键词优化大师
  • 南沙移动网站建设/友の 连接
  • 潜江市建设工程合同备案网站/公司官网模板
  • 科技经济导刊官网/南宁百度seo排名价格
  • 官网seo怎么做/搜索引擎优化的分类
  • JAVA做论坛网站的源代码/百度seo
  • 柳州团购汽车网站建设/搜索引擎搜索
  • 阿里云怎么上传网站/上海网络营销有限公司
  • 公司品牌网站建设/seo关键词排名优化教程
  • 广州市官网网站建设报价/新产品推广方案怎么写
  • 如何给自己公司做一个网站/东莞seo培训
  • wordpress垂直模板/长沙竞价优化
  • 目前网站是做响应式的好吗/班级优化大师手机版下载(免费)
  • 做seo网站诊断书怎么做/市场调研报告包括哪些内容
  • 3D 建模核心术语扫盲:拓扑、UV 展开、烘焙与 AO 贴图解析
  • 【网安播报】Lazarus Group 利用开源包展开长期供应链间谍战
  • 深度理解 linux 系统内存分配
  • 问题1:uniapp在pages样式穿刺没有问题,在components组件中样式穿刺小程序不起效果
  • 设计模式---单例
  • 01 基于sklearn的机械学习-机械学习的分类、sklearn的安装、sklearn数据集、数据集的划分、特征工程中特征提取与无量纲化