成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

再談讓C++更像C#:C#內存泄露問題

開發 后端
前段時間寫了一篇日志叫《讓C++更像C#》,本文解決了一個重要的遺留問題:C#內存泄露。

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

現在,就進一步研究這個C#內存泄露的問題。

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

  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.  
  15.         // The memory lie between the stack top and stack commited.  
  16.         return true;  
  17.     }  
  18.  
  19.     // Pointer dosen't point to the stack  
  20.     return false;  

現在只需要把CTest可能引起內存泄漏的函數修改為如下,就可以解決問題了:

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

這里使用指針引用的好處是在防止在釋放了指針的內存后,用戶繼續訪問指針的內存。

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

這樣,這個C#內存泄露問題就解決了。有關TIB的技術參考為:

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

【編輯推薦】

  1. 學習C#消息:循序漸進
  2. 解惑答疑:C#委托和事件
  3. 學習C#實現HTTP協議:多線程文件傳輸
  4. 進一步接觸C#委托與事件
  5. 淺析四種C#轉換的區別
責任編輯:book05 來源: 新浪博客
相關推薦

2009-08-19 10:09:21

C#和C++

2025-03-04 04:00:00

C++代碼windows

2009-08-25 17:15:50

C#隱藏C#重寫C#重載

2009-09-01 15:24:59

C++、C#和JAVA

2009-08-25 14:42:41

由C++轉向C#

2009-08-25 09:49:09

C#內存Graphic

2011-05-18 18:05:47

C#C++

2011-05-18 17:56:38

C#C++

2009-09-02 17:10:45

C#語言入門

2009-08-25 17:21:31

C#索引

2009-08-06 10:35:27

C# lock thi

2009-09-04 17:34:11

C#CC++

2011-10-12 06:09:32

Dart

2009-08-13 17:04:09

C#語言C#程序

2009-08-25 17:59:49

C#入門

2009-08-27 16:11:03

C# delegateC# event

2009-09-03 16:58:49

C#內存管理

2009-08-20 11:01:51

C#操作內存

2009-08-20 15:54:48

從C#到C++

2009-08-18 10:30:30

C#枚舉
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲免费视频网站 | 黄色大片网 | 一二三四在线视频观看社区 | 天天色天天 | 久久r精品 | 午夜欧美a级理论片915影院 | 欧美精品一区在线观看 | 一区中文字幕 | 久久久久91 | 免费v片在线观看 | 国产欧美精品一区二区 | 超碰精品在线 | 成人网址在线观看 | 成人免费观看视频 | 久久精品一级 | 美女艹b| 亚洲视频一区二区三区 | 中文字幕乱码一区二区三区 | 国产精品美女久久久久久免费 | 免费的网站www | 亚洲精品99 | 亚洲综合色视频在线观看 | 久久久精彩视频 | 国产一区二区中文字幕 | 尹人av| 亚洲美女一区 | 视频在线亚洲 | 99成人免费视频 | 久久久www成人免费精品张筱雨 | 国偷自产av一区二区三区 | 91中文字幕在线观看 | 北条麻妃一区二区三区在线视频 | 国产成人精品一区二区 | 国产精品国产亚洲精品看不卡15 | 亚洲人人 | 97久久精品午夜一区二区 | 国产精品久久久久久影视 | 国产精品乱码一二三区的特点 | 欧美精品一区三区 | 免费xxxx大片国产在线 | 国产一区二区欧美 |