再谈让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++

2009-09-01 15:24:59

C++、C#和JAVA

2011-05-18 18:05:47

C#C++

2009-08-25 09:49:09

C#内存Graphic

2009-08-25 17:15:50

C#隐藏C#重写C#重载

2009-08-25 14:42:41

由C++转向C#

2009-09-02 17:10:45

C#语言入门

2011-05-18 17:56:38

C#C++

2009-09-04 17:34:11

C#CC++

2009-08-06 10:35:27

C# lock thi

2009-08-25 17:21:31

C#索引

2009-08-13 17:04:09

C#语言C#程序

2009-08-27 16:11:03

C# delegateC# event

2009-08-25 17:59:49

C#入门

2011-10-12 06:09:32

Dart

2009-09-03 16:58:49

C#内存管理

2009-08-20 11:01:51

C#操作内存

2010-01-15 18:35:25

C++的类

2010-01-18 11:05:24

C++

2009-04-10 13:57:50

C#C++Java
点赞
收藏

51CTO技术栈公众号