编译器使用 COM 引用计数机制来确定对象是否不再使用并可以删除。 因为从 Windows 运行时接口派生的对象实际上是 COM 对象,所以这是可行的。 在创建或复制对象时,引用计数会递增;当对象设置为 null 或超出范围时,引用计数会递减。 如果引用计数归零,将立即自动删除对象。

句柄声明符的优点在于,在 COM 中,您必须以显式方式管理对象的引用计数,而这个过程单调乏味又容易出错。 也就是说,要递增或递减引用计数,必须调用对象的 AddRef() 和 Release() 方法。 但是,如果使用对象声明符声明一个对象,则 Visual C++ 编译器会生成自动调整引用计数的代码。

系统使用 CLR 垃圾回收器机制来确定对象是否已不再使用且可以删除。 公共语言运行时会维护一个用来分配对象的堆,并在程序中使用托管引用(变量)来指示对象在堆上的位置。 当不再使用某个对象时,会释放它在堆上占用的内存。 垃圾回收器会定期压缩该堆,已更好地利用释放的内存。 压缩堆可能会移动堆上的对象,这会使托管引用所引用的位置不再有效。 但是,垃圾回收器知道所有托管引用的位置,并会自动更新位置来指示对象在堆上的当前位置。

因为本机 C++ 指针 (*) 和引用 (&) 都是托管引用,所以垃圾回收器不能更新它们指向的地址。 若要解决此问题,请使用句柄声明符指定一个变量,垃圾回收器能够知道这个变量的状态并会自动进行更新。

在 Visual C++ 2002 和 Visual C++ 2003 中,使用 __gc * 来声明托管堆上的对象。在新的语法中,^ 取代了 __gc *

clr(Windows 运行时和公共语言运行时)的更多相关文章

  1. 混合语言编程:启用CLR(公共语言运行时编译)让C#调用C++

    前言 关于混合C#和C++的编程方式,本人之前写过一篇博客(参见混合语言编程:C#使用原生的Directx和OpenGL),在之前的博客中,介绍了在C#的Winform和WPF下使用原生的Direct ...

  2. 公共语言运行时支持(/clr)

    项目属性 -> 配置属性 -> “常规”里开启“公共语言运行时支持(/clr)

  3. [bug]”System.InvalidProgramException:公共语言运行时检测到无效程序“解决方案

    Visual Studio 2017版本15.8.x运行某些程序会报这样的错误:“System.InvalidProgramException:公共语言运行时检测到无效程序” 此问题的临时解决方案: ...

  4. .NET 实现启动时重定向程序运行路径及 Windows 服务运行模式部署

    日常工作中有时候会遇到需要将程序直接在服务器上运行,而不依赖于 IIS 托管的情况,直接运行有两种方式,一种是部署为 服务模式,另一种则是 直接启动 .NET 发布之后的 exe 文件以 控制台模式运 ...

  5. 公共语言运行库(CLR)开发系列课程(1):Pinvoke 简介 学习笔记

    前言 让拖管代码对象和非托管对象协同工作的过程称为互用性(Interoperability),通常简称为 Interop. P/Invoke在托管代码与非托管代码交互式时产生一个事务(Transiti ...

  6. 公共语言运行库(CLR)和中间语言(IL)(一)

    公共语言运行库(.net运行库)即CLR 1.C#先编译为IL,IL为ms的中间语言,IL是平台无关性的. 2.CLR再将IL编译为平台专用语言. 3.CLR在编译IL时为即时编译(JIT) VB.V ...

  7. CLR 公共语言运行库

    1..支持多语言..只是语言是面向CLR的..均可以在此基础上运行. 2..程序集加载..程序打包之后的Dll文件由CLR(公共语言运行库)来编译并加载到可以执行状态..由CLR(公共语言运行库)加载 ...

  8. EBS运行快速安装的程序时,提示DISPLAY变量设置不对

    EBS运行快速安装的程序时,系统提示如下: Rapid Install Wizard is validating your file system...... >> Wizard requ ...

  9. winform托盘时,要运行一个实例,解决办法

    需求:winform应用程序,当隐藏到托盘时,再次运行exe程序,让其只运行一个实例,并且把窗口从托盘中显示出来 应用程序名可以通过下面代码,获取到: Process current = Proces ...

随机推荐

  1. java容器集合

    java 集合分为 Collection 和 Map 两大类 Collection 是 Java 集合框架的顶层接口,它是对容器类进行增.删.改.查的定义,同时继承了 Iterable 接口,具有对集 ...

  2. Intellij idea 创建JAVA项目

    1. 打开软件,new一个project的java项目 2. 点击下一步,此界面可通过模板生成项目,如下图 3. 填写项目名称和项目源码的保存路径,如下图 4. 点击 Finish 完成按钮即可,项目 ...

  3. php 根据周数获取当周的开始日期与最后日期

    /** * 根据第几周获取当周的开始日期与最后日期 * @param int $year 年份 $weeks = get_week($year) * @param 如获取第18周的开始日期$weeks ...

  4. css样式优先级问题

    官方表述的CSS样式优先级如下: 通用选择器(*) < 元素(类型)选择器 < 类选择器 < 属性选择器 < 伪类 < ID 选择器 < 内联样式 那么,我们来举个 ...

  5. html5 02 随记

    HTML 02 全局通用属性  id  name  class  style 一. 图像标签 标签名:<img  /> 常用属性: Alt -- 代表图像的替代文字 作用: 当图片不显示的 ...

  6. cocos的Director、Scence、Layer(一)---摘自于官方文档

    基本结构图(重要) Director: 有那些作用? OpenGL ES的初始化,场景的转换,游戏暂停继续的控制,世界坐标和GL坐标之间的切换,对节点(游戏元素)的控制,游戏数据的保存调用,屏幕尺寸的 ...

  7. sqlserver创建触发器

    Create TRIGGER [dbo].[tr_Delete_AllocationedDN] --删除指定账户已分配未拣货的任务 ON [dbo].[FRU_PickLocationNew] --触 ...

  8. 监测元素resize

    前言 近来有需求要做分页,听起来可能有点Low. 所以我要把Low的事情做得有点逼格. 分页本身没啥,但是数据量起来了,比如十万. 要是不做点处理, 那你的页面估计爽得很,机器也爽得很. 放心,我不会 ...

  9. 《spss统计分析与行业应用案例详解》:实例十二 卡方检验

    卡方检验的功能与意义 SPSS的卡方检验是非参数检验方法的一种,其基本功能足通过样本的 频数分布来推断总体是否服从某种理论分布或某种假设分布,这种检验过程是通过分析实际的频数与理论的频数之间的差别或是 ...

  10. CF Gym 100463B Music Mess (思路)

    好题,当时想了半个小时,我往图论方面去想了,把出现过的字符串当场点,然后相互连边,那么就构成了一个三角形,一个大于三个点的连通分量里有以下结论:度为二的点可能是track,度为大于二的点一定不是tra ...