C#内存泄露问题分析
这篇文章主要介绍“C#内存泄露问题分析”,在日常操作中,相信很多人在C#内存泄露问题分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#内存泄露问题分析”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
今天在看国外的一篇技术文章的时候,发现有人就在研究这个问题!他给出了一种解决办法。首先把他介绍,操作系统会为每一个系统中运行的线程分配一个数据结构叫做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#内存泄露问题分析”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341