gcnew 与 new 的区别

C++/CLI中使用gcnew关键字表示在托管堆上分配内存,并且为了与以前的指针区分,用^来替换* ,就语义上来说他们的区别大致如下:

  1. gcnew返回的是一个句柄(Handle),而new返回的是实际的内存地址.
  2. gcnew创建的对象由虚拟机托管,而new创建的对象必须自己来管理和释放.
  3. 那什么又是托管堆呢?
    内存格局通常分为四个区
    全局数据区:存放全局变量,静态数据,常量
    代码区:存放所有的程序代码
    栈区:存放为运行而分配的局部变量,参数,返回数据,返回地址等,
    堆区:即自由存储区
    值类型变量与引用类型变量的内存分配模型也不一样。为了理解清楚这个问题,读者首先必须区分两种不同类型的内存区域:线程堆栈(Thread Stack)和托管堆(Managed Heap)。
    每个正在运行的程序都对应着一个进程(process),在一个进程内部,可以有一个或多
    个线程(thread),每个线程都拥有一块“自留地”,称为“线程堆栈”,大小为1M,用于保
    存自身的一些数据,比如函数中定义的局部变量、函数调用时传送的参数值等,这部分内存
    区域的分配与回收不需要程序员干涉。
    所有值类型的变量都是在线程堆栈中分配的。
    另一块内存区域称为“堆(heap)”,在.NET 这种托管环境下,堆由CLR 进行管理,所
    以又称为“托管堆(managed heap)”。
    用new 关键字创建的类的对象时,分配给对象的内存单元就位于托管堆中。
    在程序中我们可以随意地使用new 关键字创建多个对象,因此,托管堆中的内存资源
    是可以动态申请并使用的,当然用完了必须归还。
    打个比方更易理解:托管堆相当于一个旅馆,其中的房间相当于托管堆中所拥有的内存
    单元。当程序员用new 方法创建对象时,相当于游客向旅馆预订房间,旅馆管理员会先看一下有没有合适的空房间,有的话,就可以将此房间提供给游客住宿。当游客旅途结束,要办理退房手续,房间又可以为其他旅客提供服务了。
    从表 1 可以看到,引用类型共有四种:类类型、接口类型、数组类型和委托类型。
    所有引用类型变量所引用的对象,其内存都是在托管堆中分配的。
    严格地说,我们常说的“对象变量”其实是类类型的引用变量。但在实际中人们经常将
    引用类型的变量简称为“对象变量”,用它来指代所有四种类型的引用变量。
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值