C#内存泄露问题分析

这篇文章主要介绍“C#内存泄露问题分析”,在日常操作中,相信很多人在C#内存泄露问题分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#内存泄露问题分析”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

创新互联公司-专业网站定制、快速模板网站建设、高性价比潮安网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式潮安网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖潮安地区。费用合理售后完善,10余年实体公司更值得信赖。

今天在看国外的一篇技术文章的时候,发现有人就在研究这个问题!他给出了一种解决办法。首先把他介绍,操作系统会为每一个系统中运行的线程分配一个数据结构叫做TIB(Thread Information Block)或者叫TEB(Thread Enviroment BLock)。里面记录了与某个线程相关的所有信息。当然包括线程相关的堆栈地址信息。而堆栈的栈顶与栈基址分别存放在FS寄存器的4与8位置处。所以他通过嵌入式汇编实现了判断指针是栈指针,还是堆指针的方法。代码如下:

bool IsMemoryOnStack( LPVOID pVoid )  {      LPVOID dwStackTop = 0;      LPVOID dwStackLowCurrent = 0;      __asm      {             mov EAX, FS:[4]             mov dwStackTop, eax              mov EAX, FS:[8]              mov dwStackLowCurrent, eax      }      if( pVoid < = dwStackTop && pVoid >= dwStackLowCurrent )      {           // The memory lie between the stack top and stack commited.          return true;      }       // Pointer dosen't point to the stack      return false;  }

现在只需要把CTest可能引起内存泄漏的函数修改为如下,就可以解决问题了:

CTest(CTest* & t)    {    this->x=t->getX();     if(!IsMemoryOnStack(t))     {        delete t;        t=0;     }   }

这里使用指针引用的好处是在防止在释放了指针的内存后,用户继续访问指针的内存。

到此,关于“C#内存泄露问题分析”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!


本文名称:C#内存泄露问题分析
文章网址:http://pwwzsj.com/article/jedeoj.html