gcnew 与 new 的区别
生活随笔
收集整理的這篇文章主要介紹了
gcnew 与 new 的区别
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
C++/CLI中使用gcnew關鍵字表示在托管堆上分配內(nèi)存,并且為了與以前的指針區(qū)分,用^來替換* ,就語義上來說他們的區(qū)別大致如下:
內(nèi)存格局通常分為四個區(qū)
全局數(shù)據(jù)區(qū):存放全局變量,靜態(tài)數(shù)據(jù),常量
代碼區(qū):存放所有的程序代碼
棧區(qū):存放為運行而分配的局部變量,參數(shù),返回數(shù)據(jù),返回地址等,
堆區(qū):即自由存儲區(qū)
值類型變量與引用類型變量的內(nèi)存分配模型也不一樣。為了理解清楚這個問題,讀者首先必須區(qū)分兩種不同類型的內(nèi)存區(qū)域:線程堆棧(Thread Stack)和托管堆(Managed Heap)。
每個正在運行的程序都對應著一個進程(process),在一個進程內(nèi)部,可以有一個或多
個線程(thread),每個線程都擁有一塊“自留地”,稱為“線程堆棧”,大小為1M,用于保
存自身的一些數(shù)據(jù),比如函數(shù)中定義的局部變量、函數(shù)調(diào)用時傳送的參數(shù)值等,這部分內(nèi)存
區(qū)域的分配與回收不需要程序員干涉。
所有值類型的變量都是在線程堆棧中分配的。
另一塊內(nèi)存區(qū)域稱為“堆(heap)”,在.NET 這種托管環(huán)境下,堆由CLR 進行管理,所
以又稱為“托管堆(managed heap)”。
用new 關鍵字創(chuàng)建的類的對象時,分配給對象的內(nèi)存單元就位于托管堆中。
在程序中我們可以隨意地使用new 關鍵字創(chuàng)建多個對象,因此,托管堆中的內(nèi)存資源
是可以動態(tài)申請并使用的,當然用完了必須歸還。
打個比方更易理解:托管堆相當于一個旅館,其中的房間相當于托管堆中所擁有的內(nèi)存
單元。當程序員用new 方法創(chuàng)建對象時,相當于游客向旅館預訂房間,旅館管理員會先看一下有沒有合適的空房間,有的話,就可以將此房間提供給游客住宿。當游客旅途結(jié)束,要辦理退房手續(xù),房間又可以為其他旅客提供服務了。
從表 1 可以看到,引用類型共有四種:類類型、接口類型、數(shù)組類型和委托類型。
所有引用類型變量所引用的對象,其內(nèi)存都是在托管堆中分配的。
嚴格地說,我們常說的“對象變量”其實是類類型的引用變量。但在實際中人們經(jīng)常將
引用類型的變量簡稱為“對象變量”,用它來指代所有四種類型的引用變量。
總結(jié)
以上是生活随笔為你收集整理的gcnew 与 new 的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java - 排序大全
- 下一篇: 关于Dockerfile那些事: 基础镜