日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
再談讓C++更像C#:C#內(nèi)存泄露問題

前段時間寫了一篇日志叫《讓C++更像C#》,但我寫的那段示例代碼中的有關(guān)內(nèi)存泄漏的問題當(dāng)時我說先不管,其實是那時沒有找到很好的解決方法。不好解決C#內(nèi)存泄露的原因是,沒有辦法去判斷一個指針到底是指向堆內(nèi)存,還是指向棧內(nèi)存(windows系統(tǒng)沒有API來實現(xiàn)這樣的功能)。當(dāng)時google、baidu都搜遍了,沒有找到解決辦法。

現(xiàn)在,就進(jìn)一步研究這個C#內(nèi)存泄露的問題。

今天在看國外的一篇技術(shù)文章的時候,發(fā)現(xiàn)有人就在研究這個問題!他給出了一種解決辦法。首先把他介紹,操作系統(tǒng)會為每一個系統(tǒng)中運行的線程分配一個數(shù)據(jù)結(jié)構(gòu)叫做TIB(Thread Information Block)或者叫TEB(Thread Enviroment BLock)。里面記錄了與某個線程相關(guān)的所有信息。當(dāng)然包括線程相關(guān)的堆棧地址信息。而堆棧的棧頂與?;贩謩e存放在FS寄存器的4與8位置處。所以他通過嵌入式匯編實現(xiàn)了判斷指針是棧指針,還是堆指針的方法。代碼如下:

 
 
 
  1. bool IsMemoryOnStack( LPVOID pVoid )
  2. {
  3.     LPVOID dwStackTop = 0;
  4.     LPVOID dwStackLowCurrent = 0;
  5.     __asm
  6.     {
  7.            mov EAX, FS:[4]
  8.            mov dwStackTop, eax
  9.             mov EAX, FS:[8]
  10.             mov dwStackLowCurrent, eax
  11.     }
  12.     if( pVoid < = dwStackTop && pVoid >= dwStackLowCurrent )
  13.     {
  14.         // The memory lie between the stack top and stack commited.
  15.         return true;
  16.     }
  17.     // Pointer dosen't point to the stack
  18.     return false;
  19. }

現(xiàn)在只需要把CTest可能引起內(nèi)存泄漏的函數(shù)修改為如下,就可以解決問題了:

 
 
 
  1. CTest(CTest* & t) 
  2.  {
  3.   this->x=t->getX();
  4.   if(!IsMemoryOnStack(t))
  5.   {
  6.      delete t;
  7.      t=0;
  8.   }
  9.  }

這里使用指針引用的好處是在防止在釋放了指針的內(nèi)存后,用戶繼續(xù)訪問指針的內(nèi)存。

到此為止,問題全部解決了!印度的軟件行業(yè)確實是挺牛比的!

這樣,這個C#內(nèi)存泄露問題就解決了。有關(guān)TIB的技術(shù)參考為:

http://www.microsoft.com/msj/archive/S2CE.aspx


新聞名稱:再談讓C++更像C#:C#內(nèi)存泄露問題
鏈接地址:http://www.dlmjj.cn/article/djdgiii.html