託管和非託管區別

託管和非託管是修飾內存的。
託管的意思,你不用直接操做內存,你須要的時候跟我說。我替你申請,而後給你用,你用完能夠告訴我,我幫你釋放,若是你忙,忘記告訴我了,我也會在按期去幫你釋放的。 這就是託管,你打交道的不是直接的內存,而是.net clr。
非託管的意思就是你要本身負責管理內存,這裏所說的內存管理。實際上只是堆上的內存管理,棧內存和之前的同樣,函數退出則釋放,heap上的內存,非託管內存須要本身分配,調用構造函數(c須要,c++裏用new替代這部操做了),使用完畢後,須要本身釋放這個內存,若是你不當心,吧只想內存的指針弄丟了,就形成內存泄露了,這個內存泄露在你程序退出以前是沒法彌補的,因此要當心。(virtualMalloc的狀況不在此描述了。由於分配的也不是heap上的內存,屬於擴展內存空間,題外話了。)c++

簡單說,託管的意思是託管內存,但多一層必然會慢,這個麼,微軟早考慮好了,硬件升級,你們掏錢就能解決的問題不是問題。帶來的好處是託管內存不會有泄漏的危險。c#

 

例子麼。c#和c++的區別了函數


//c# 例子
public class Test
{
  //blank class
}操作系統

Test c = new Test();
/*到此結束,你的程序將不會被任何人指責有問題,也實際上真的沒問題,由於當垃圾回收:
GC.Collect()
的時候。就會遍歷找到沒有被引用的對象,就會被嘗試調用Dispose和析構函數,最終釋放內存。
*/.net


//c++ 例子
class CTest
{
    public:
    //blank class
};指針

CTest s;//在棧上分配內存,退出函數則自動執行析構函數釋放內存
CTest *pTest = new CTest();//在堆上分配內存,並調用構造函數
delete pTest;
/*
手工釋放堆上分配的內存,不然離開函數,將沒有指針指向這塊區域,而形成這塊內存沒法釋放,形成內存泄露。說道內存泄露,不得不說內存分配,程序運行後,會由操做系統分配內存空間,給一段虛擬地址,而後又一個虛擬地址到物理地址的映射表,內存的申請通常是按頁申請的,會有記錄你申請哪些,哪些是空閒的,若是你申請了沒釋放,下次就不會吧這個標記爲被申請的內存再次分配出去,直到被標記爲未申請。軟件退出的時候,操做系統進行資源回收,會釋放掉進程的這些內存。若是有地址分配了,但沒釋放,也是在這個時候釋放的。
若是軟件運行時間長,你老是分配,忘記釋放,就會佔用不少內存,愈來愈慢,最終致使內存溢出。這個忘記釋放的行爲就叫內存泄露。
*/對象

 


CTest *pTest = new CTest();
/*
這裏分配了2次空間:
1.[CTest *pTest]CTest指針變量,存放在棧內存中,名字爲pTest
2.[new CTest()]在Heap上分配了一塊長度爲sizeof(CTest)的內存,返回內存的地址,存儲在棧變量pTest中
*/
delete pTest;//根據pTest保存的地址,釋放new CTest分配的內存,哦對了,釋放前先執行析構函數。進程

相關文章
相關標籤/搜索